表单身份验证SSO-为什么User.Identity.IsAuthenticated==false



我正在尝试使用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中的加密算法已经更改。

最新更新