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

时间:2014-01-16 15:56:02

标签: asp.net forms-authentication

我正在尝试使用表单身份验证在两个单独的IIS网站(使用公共域)上设置SSO。我正在使用将auth cookie设置为公共域并使用匹配的机器密钥启用解密的常用方法。

这对我创建的测试网站没有任何问题。但是,当试图在遗留的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" />

更新两个网站以定位相同的框架解决了问题。

1 个答案:

答案 0 :(得分:2)

GetAuthCookie会创建一个新的Cookie:

http://msdn.microsoft.com/en-us/library/vstudio/3fay1e4k(v=vs.100).aspx

  
    

为给定的用户名创建身份验证cookie。这不会将cookie设置为传出响应的一部分,因此应用程序可以更好地控制cookie的发布方式。

  

难怪它有效,它不会查看现有的cookie。

我的理论是,您在x64计算机上拥有新网站,而旧网站位于x86中。即使密钥相同,加密也会在这种情况下有所不同。另一个可能的原因是.net的不同版本,因为.net 4中已经改变了加密算法。