我有几个应用程序,其中一个是管理身份验证的中央应用程序,其中一个LogOn
页面作为一个导入IFrame
到其他应用程序。
当userName
andpassword
正确时,我创建一个名为userInfo
.
现在,在当前应用程序中,我想检查 cookie 是否userInfo
存在。我想我应该检查它是否存在于浏览器中(在客户端)。
这一定是可能的,那我该怎么做呢?
提前致谢。
我有几个应用程序,其中一个是管理身份验证的中央应用程序,其中一个LogOn
页面作为一个导入IFrame
到其他应用程序。
当userName
andpassword
正确时,我创建一个名为userInfo
.
现在,在当前应用程序中,我想检查 cookie 是否userInfo
存在。我想我应该检查它是否存在于浏览器中(在客户端)。
这一定是可能的,那我该怎么做呢?
提前致谢。
Cookie 不能跨域共享。如果您的应用程序不是托管在同一个域上,您必须忘记这一点。它不起作用,因为浏览器(出于明显的安全原因)不会跨域发送 cookie。还有其他方法可以实现跨域单点登录(请参阅我的答案的第二部分)。
现在让我们假设您的应用程序位于同一个域中,并且您有多个应用程序分布在根域的不同子域中:
并且您想在这些子域之间共享身份验证。您所要做的就是指定将domain
web.config 中的属性设置为根域:
<authentication mode="Forms">
<forms
loginUrl="https://login.foo.com"
requireSSL="true"
protection="All"
timeout="120"
domain="foo.com"
slidingExpiration="false"
name="sso" />
</authentication>
应将相同的配置应用于web.config
所有应用程序。这几乎就是您需要做的所有事情。一旦用户在其中一个子域上通过身份验证,由于 cookie 可以跨子域共享这一事实,他将自动在其他子域上进行身份验证。
如果要实现跨域单点登录,则必须采用不同的方法。您可以在不同应用程序之间使用相同的机器密钥来加密身份验证令牌。以下是步骤:
https://foo.com
并显示登录屏幕,因为他尚未在此域上进行身份验证。foo.com
域有效。现在,用户需要转到https://bar.com
此域并在此域上自动进行身份验证。在某些页面上,https://foo.com
您可以创建一个包含要发布的身份验证 cookie 值的表单:
<form action="https://bar.com" method="post">
<input type="hidden" name="token" value="PUT THE VALUE OF THE AUTHENTICATION COOKIE HERE" />
<button type="submit">Go to bar.com</button>
</form>
bar.com
. 接收此表单提交的脚本读取已发布的身份验证令牌值,并使用该FormsAuthentication.Decrypt
方法解密身份验证票并读取用户名。由于两个应用程序都foo.com
使用bar.com
相同的机器密钥,因此在 foo.com 上加密的票证将被 bar.com 成功解密bar.com
从令牌中提取经过身份验证的用户名的脚本,它发出一个表单身份验证cookie,在bar.com
使用该FormsAuthentication.SetAuthCookie
方法时有效。bar.com
该模型的整体安全性依赖于这样一个事实,即在将表单身份验证令牌从foo.com
到发送时使用 SSL,因此中间人bar.com
无法捕获令牌,并且两个应用程序共享相同的机器密钥用于加密和解密那些令牌。