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

Asp.net 表单身份验证SSO-为什么User.Identity.IsAuthenticated==false,asp.net,forms-authentication,Asp.net,Forms Authentication,我正在尝试使用表单身份验证在两个独立的IIS网站(具有公共域)上设置SSO。我使用的方法是将auth cookie设置为公共域,并使用匹配的机器密钥来启用解密 这在我创建的测试站点上没有问题。然而,当我试图在一个遗留的Web表单站点中实现这一点时,我遇到了一些我不理解的问题 当我登录到一个站点时,第二个站点上的测试代码具有以下结果: var cookie = FormsAuthentication.GetAuthCookie("username", false); // works var ft

我正在尝试使用表单身份验证在两个独立的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
不是获取现有auth cookie的有效方法。这让我想到了一点:我可以在浏览器中看到顶级域cookie,但它不会显示在请求中。我怀疑这就是问题所在

解决方案:两个站点的目标不是web.config指定的相同版本的.Net Framework:

<httpRuntime targetFramework="4.5" />
<compilation debug="true" targetFramework="4.5" />


更新两个站点以针对同一框架修复了该问题。
GetAuthCookie
将创建一个新的cookie:

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

难怪它能工作,它不会查看现有的cookie


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

我没有意识到它没有读取现有的cookie,谢谢。至于第二部分,两个站点都在同一台机器上,所以我认为这不是问题所在——尽管它们可能使用不同版本的.NetYep,但加密算法在.net4.+1中已经更改,以便为我指明正确的方向。该问题甚至在4.0和4.5站点之间也会出现(由
HttpRuntime
web.config
中的
Compilation
标记指定),此线程可能会有所帮助