我有两台服务器:STS和Web。 在 STS 服务器上,我调用:
FormsService.SignIn(model.UserName, false);
下一行,我检查:
User.Identity.IsAuthenticated
这设置为 TRUE。 然后我重定向回我的 Web 服务器,在我点击的控制器中,我检查:
User.Identity.IsAuthenticated
这设置为 FALSE。
What could cause this?
更新:我也刚刚尝试将STS网站移动到Web服务器。我收到同样的错误/问题
更新:我忘了提到我们的 DEV 服务器工作得很好。 那里的配置是相同的(除了服务器名称和证书指纹)。 这两个服务器之间的唯一区别是其中一个(DEV)正在使用自签名证书并且位于我们的防火墙内。 另一个(QA)正在使用官方(解冻)证书,并且是我们的防火墙。 此证书的公用名与服务器名称不匹配(因此可以在我们的服务器场中共享)。 因此,当我们访问该网站时,我们使用 https://[commonname].com/web而不是 https://[servername]/web。 我尝试了后一种方法(我收到名称不匹配的证书错误),但仍然有相同的结果。
另外,我可以直接访问STS站点并在那里登录。
ASP.NET 身份验证基于 cookie。Cookie 存在于网络域中。因此,如果您像这样安装了两台服务器:
- http://www.web.com
- http://www.sts.com
WEB 服务器无法读取 STS 设置的 cookie
有两种可能的解决方案:
- 将两个服务器都实现为子域
- 将身份验证票证存储在 URL 而不是 cookie 中
对于选项 1按如下方式移动服务器:
- http://www.web.yourdomain.com
- http://www.sts.yourdomain.com
更新 web.config 以将 cookie 的范围限定为 yourdomain.com:
<authentication mode="Forms">
<forms domain=".yourdomain.com"/>
</authentication>
要在 url 中存储票证,请查看这篇文章 - http://www.codeproject.com/Articles/2796/Cookieless-ASP-NET-forms-authentication
更新:似乎我没有得到STS代表安全令牌服务。我的回答无关紧要。:(
从STS
服务器重定向时,您必须使用AutoPost
表单重定向,该表单会将token
提交给Relying party
。
当Relying party
收到令牌时,它将针对该用户创建cookie。
因此,下次您将在信赖方检查User.Identity.IsAuthenticated
时,它将返回True
。
点击以下链接了解更多信息,
http://chris.59north.com/post/2013/03/27/Claims-based-identities-in-ASPNET-MVC-45-using-the-standard-ASPNET-providers.aspx
将 RP 移动到其他服务器时,我们遇到了同样的问题。 事实证明,我们需要进入应用程序池 ->高级设置 ->设置"加载用户配置文件"= true。
之后,一切都在新服务器上正常工作,User.Identity.IsAuthentication在从STS返回后返回"true"。