MVC4 / IIS / Forms身份验证SSO问题

时间:2013-04-11 10:46:43

标签: c# asp.net-mvc iis forms-authentication session-cookies

我在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

    }
}

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您的Controller类上有一个Authorize属性,这意味着您的SSO方法将应用AllowAnonymous和Authorize。在这种情况下,Authorize属性看起来需要删除。

答案 1 :(得分:0)

您的 BaseControllerTestable 是什么?你有授权属性吗?您的Base类将在它到达派生类的其他方法之前被实例化。因此,如果您有任何机会在基本控制器上使用[授权],可能会对您造成问题。

答案 2 :(得分:0)

我想我终于解决了这个问题(我们只会知道,一旦我们有一段时间没有复发,因为它无论如何都是断断续续的)

有几个因素发挥作用。首先我注意到一些静态项目(主要是css + js文件),即使它们应该可以自由访问,但它们也被认证循环,所以我在web.config中添加了一个位置规则,以确保它们被允许匿名用户。我还添加了一个路由例外来忽略favicon.ico请求。这似乎阻止了代码在第一次进行身份验证时绊倒自己。最后,问题是间歇性的原因是由于另一个错误,如果有任何其他会话打开(数据库驱动)问题没有发生。这解释了为什么这个错误只发生在凌晨,即:前一天的所有会话都已过期。