【问题标题】:Forms Authentication SSO - Why does User.Identity.IsAuthenticated == false表单身份验证 SSO - 为什么 User.Identity.IsAuthenticated == false
【发布时间】:2014-01-16 15:56:01
【问题描述】:

我正在尝试使用表单身份验证在两个单独的 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" />

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

【问题讨论】:

标签: asp.net forms-authentication


【解决方案1】:

GetAuthCookie 创建一个新的 cookie:

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

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

难怪它会起作用,它不会查看现有的 cookie。

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

【讨论】:

  • 我没有意识到它不会读取现有的 cookie,谢谢。至于第二部分,两个站点都在同一台机器上,所以我认为这不是问题——尽管它们可能使用不同版本的 .Net
  • 是的,.net 4 中的加密算法已更改。
  • +1 为我指明了正确的方向。即使在 4.0 和 4.5 的站点之间也会出现此问题(由 web.config 中的 HttpRuntimeCompilation 标签指定)
猜你喜欢
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
相关资源
最近更新 更多