如果您现有的登录门户使用表单身份验证,那么您可以在应用程序之间共享加密密钥,以便它们可以读取在登录门户中创建的身份验证 cookie:
How can I share .net (C#) based authenticated session between web forms and MVC2 applications?
如果您没有在登录门户中使用表单身份验证,则可以保留现有流程,但添加一个手动创建身份验证 cookie 的步骤。对此有很多变化,但这个问题在问题中显示了更高级别的方法,而在答案中显示了较低级别的方法:
How can I manually create a authentication cookie instead of the default method?
这也要求应用程序之间的加密配置相同。
否则,您要么只能使用 SSO 协议进行切换。您可以为您的登录门户保留现有的身份验证过程,但需要添加额外的代码来协调 SSO 到其他应用程序的切换。 SSO 的出现是因为除了上面 #1 和 2 中使用的加密 cookie 方法之外,几乎没有其他安全选项可用于进行浏览器重定向和通信身份验证。
创建您自己的基于 cookie 的方法是有风险的,并且可能会打开您无法预见的安全漏洞。
关于该示例的重要一点是,尚不清楚SetAuthCookie(username, ... 中的用户名来自何处。该问题意味着用户将登录到其他应用程序,并且该应用程序将查询 Web 服务以确定该登录是否有效。在这种情况下,它不是使用专用登录门户进行单点登录,而是每个应用程序都会收集登录信息并询问 Web API 是否有效。在您的情况下,您不想收集每个门户中的登录信息,而是检测他们已经登录到专用登录门户。
所以问题是当您调用SetAuthCookie(username, ... 时,登录程序如何以安全的方式告诉您username 是什么。这正是 SSO 的用途。使用 SSO 切换,一个站点可以以安全的方式告诉另一个站点“我将 Bob123 发送给您,您可以确定它确实是 Bob123 而不是其他人。
选项 #1 和 #2 通过让登录门户设置 cookie 来解决此问题,并通过在应用程序之间共享密钥,其他应用程序可以安全地读取该 cookie。
请注意,您不能仅使用任何 cookie 来执行此操作。表单身份验证cookie以某种方式构建,以防止cookie的伪造和其他篡改。
如果您要跨域访问,SSO 将成为您唯一的选择,因为在一个域中写入的 cookie 无法在另一个域中读取(浏览器仅提交当前域的 cookie)。
有多个子域共享一个根域的表单身份验证的解决方法:
Proper creation of a cross-domain forms authentication cookie
有多种黑客可以使用加密信息重定向到另一个站点并让该站点写入表单身份验证 cookie,但其中大多数只是与 SSO 一样复杂的可怕黑客。