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

C# MVC4/IIS/Forms身份验证SSO问题,c#,asp.net-mvc,iis,forms-authentication,session-cookies,C#,Asp.net Mvc,Iis,Forms Authentication,Session Cookies,我在MVC4/IIS/Forms身份验证方面遇到了一个奇怪的间歇性问题 我有两个站点使用SSO相互传递控制。大多数情况下,切换都会正确进行,用户会按预期重定向到下一个站点。但是,在某些情况下,用户会被要求重新登录,即使有效的SSO信息是通过网络发送的。SSO方法用[AllowAnonymous]属性修饰,web.config还有一个位置条目,允许所有用户访问/account/SSO 这似乎发生在目标站点第一次被点击时——一旦应用程序池预热,问题就会消失 其他几点: 1两个站点都是.net 4,因

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

我有两个站点使用SSO相互传递控制。大多数情况下,切换都会正确进行,用户会按预期重定向到下一个站点。但是,在某些情况下,用户会被要求重新登录,即使有效的SSO信息是通过网络发送的。
SSO
方法用
[AllowAnonymous]
属性修饰,web.config还有一个位置条目,允许所有用户访问/account/SSO

这似乎发生在目标站点第一次被点击时——一旦应用程序池预热,问题就会消失

其他几点:

1两个站点都是.net 4,因此不应存在任何遗留加密问题

2.这个问题很少发生(你的BaseControllerTestable是什么?你有任何authorization属性吗?你的基类在到达派生类上的其他方法之前会先实例化。所以如果你有[authorization]在基本控制器上,这可能是您的问题。

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

我想我终于解决了它(我们只有在经历了一段美好的时光后才能确定是否会复发,因为它是间歇性的)


有几个因素起作用。首先,我注意到一些静态项(主要是css+js文件)尽管它们应该可以自由访问,但它们仍被卷入了身份验证循环中,因此我在web.config中添加了一个位置规则,以确保匿名用户可以访问它们。我还添加了一个路由异常,以忽略favicon.ico请求,以获得更好的度量。这似乎可以防止代码在身份验证时被自己绊倒这是第一次。最后,问题间歇性出现的原因是由于另一个bug,其中是否有任何其他会话打开(db驱动)该问题没有出现。这解释了为什么错误只发生在清晨,即:前一天的所有会话都已过期。

新会话启动时是否显示登录屏幕?两个web应用程序的会话超时设置如何?它们是否有不同的应用程序池?这些池是否有循环设置?是否已结束会话站点的性能计数器和记录的站点相关性能计数器,如会话超时、重新编译?听起来绝对不是代码问题。我猜如果您使用cookie,可能是cookie超时,或者是应用程序池回收。将一些跟踪放入您的身份验证逻辑中,出现问题时是否执行SSO方法s
<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

    }
}