我正在尝试使用Forms Authentication在两个独立的IIS网站(具有公共域)上设置SSO。我使用的常见方法是将authcookie设置为公共域,并使用匹配的机器密钥来启用解密。
这在我创建的测试站点上没有问题。然而,当我试图在遗留的Web窗体网站中实现这一点时,我遇到了一些我不理解的东西。
当我登录到一个站点时,第二个站点上的测试代码有以下结果:
var cookie = FormsAuthentication.GetAuthCookie("username", false); // works
var ft = FormsAuthentication.Decrypt(cookie.Value); // returns correct info
var isAuthentication = User.Identity.IsAuthenticated; // false
作为额外的奖励,每当我登录一个网站,另一个就会被注销(双向发生)
我在这里一定遗漏了一些基本的东西。
为什么将User.Identity.IsAuthenticated
设置为false
,即使FormsAuthentication票证似乎正在解密而没有问题?
更新:如下所述-FormsAuthentication.GetAuthCookie
不是获取现有身份验证cookie的有效方式。这让我想到了:我可以在浏览器中看到顶级域cookie,但它没有显示在请求中。我怀疑这就是问题发生的地方。
解决方案:两个站点的目标不是web.config:指定的相同版本的.Net Framework
<httpRuntime targetFramework="4.5" />
<compilation debug="true" targetFramework="4.5" />
更新两个站点以针对同一框架解决了问题
GetAuthCookie
创建一个新的cookie:
http://msdn.microsoft.com/en-us/library/vstudio/3fay1e4k(v=vs.100).aspx
为给定用户名创建身份验证cookie。这不会将cookie设置为传出响应的一部分,这样应用程序就可以对cookie的发布方式有更多的控制权。
难怪它能工作,它不会查看现有的cookie。
我的理论是,你的新网站是在x64机器上,而旧网站是在x86上。在这种情况下,即使密钥相同,加密也会有所不同。另一个可能的原因是.net的不同版本,因为.net 4中的加密算法已经更改。