我在MVC4 / IIS / Forms身份验证方面遇到了一个奇怪的间歇性问题。
我有一对使用SSO将控制权交给对方的网站。大多数情况下,切换正确进行,用户将按预期重定向到下一个站点。但是,在某些情况下,即使已发送有效的SSO信息,也会要求用户再次登录。 SSO
方法使用[AllowAnonymous]
属性进行修饰, web.config 也有一个位置条目,允许所有人访问 / account / sso 用户。
首次点击目标网站时似乎会发生这种情况 - 一旦应用程序池预热,问题就会消失。
其他一些观点:
1这两个站点都是.net 4,因此不应存在任何遗留加密问题。
2.这个问题很少发生(<10%的时间),所以代码本身应该是声音的
3.托管在本地win7x64上是IIS 7.5,而azure - 在两个地方都发生了
4.似乎与浏览器无关
<location path="account/sso">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
[Authorize]
public class AccountController : BaseControllerTestable
{
public AccountController()
: base()
{
}
[AllowAnonymous]
public ActionResult SSO(string AuthToken, string Target)
{
//SSO logic here
}
}
有什么想法吗?
答案 0 :(得分:1)
您的Controller类上有一个Authorize属性,这意味着您的SSO方法将应用AllowAnonymous和Authorize。在这种情况下,Authorize属性看起来需要删除。
答案 1 :(得分:0)
您的 BaseControllerTestable 是什么?你有授权属性吗?您的Base类将在它到达派生类的其他方法之前被实例化。因此,如果您有任何机会在基本控制器上使用[授权],可能会对您造成问题。
答案 2 :(得分:0)
我想我终于解决了这个问题(我们只会知道,一旦我们有一段时间没有复发,因为它无论如何都是断断续续的)
有几个因素发挥作用。首先我注意到一些静态项目(主要是css + js文件),即使它们应该可以自由访问,但它们也被认证循环,所以我在web.config中添加了一个位置规则,以确保它们被允许匿名用户。我还添加了一个路由例外来忽略favicon.ico请求。这似乎阻止了代码在第一次进行身份验证时绊倒自己。最后,问题是间歇性的原因是由于另一个错误,如果有任何其他会话打开(数据库驱动)问题没有发生。这解释了为什么这个错误只发生在凌晨,即:前一天的所有会话都已过期。