12

我在 MVC4 / IIS / Forms 身份验证方面遇到了一个奇怪的间歇性问题。

我有一对使用 SSO 将控制权相互传递的网站。大多数情况下,切换正确发生,用户按预期重定向到下一个站点。但是,在某些情况下,即使发送了有效的 SSO 信息,也会要求用户再次登录。该SSO方法用[AllowAnonymous]属性修饰, web.config也有一个 location 条目,授予所有用户访问/account/sso的权限。

它似乎发生在第一次访问目标站点时 - 一旦应用程序池预热,问题就会消失。

其他几点:

1 两个站点都是 .net 4,因此不应存在任何遗留加密问题。
2. 这个问题很少发生(<10% 的时间),所以代码本身应该是健全的
3. 本地主机是 IIS 7.5 on win7x64,天蓝色 - 发生在两个地方
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

    }
}

有任何想法吗?

4

3 回答 3

1

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

于 2013-04-15T14:26:19.470 回答
0

你的BaseControllerTestable是什么?你那里有任何授权属性吗?您的基类将首先被​​实例化,然后才能到达派生类上的其他方法。因此,如果您有任何机会在基本控制器上有 [ Authorize ],这可能对您来说是个问题。

于 2013-04-12T03:44:33.803 回答
0

我想我终于解决了它(我们只有在我们度过了一段时间没有复发的情况下才能确定,因为它无论如何都是间歇性的)

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

于 2013-04-18T14:59:37.297 回答