2013-04-11 117 views
13

我有一个MVC4/IIS/Forms身份验证奇怪的间歇性问题。MVC4/IIS/Forms身份验证SSO问题

我有一对使用SSO将控制权交给彼此的网站。大部分时间切换正确发生,并且用户按照预期被重定向到下一个站点。但是,在某些情况下,即使发送了有效的SSO信息,也会要求用户重新登录。 SSO方法装饰有[AllowAnonymous]属性,并且web.config也具有允许所有用户访问/account/sso的位置条目。

当目标网站第一次被击中时,似乎会发生这种情况 - 一旦应用程序池被预热,问题就会消失。

的其他一些观点:

1这两个网站是.NET 4,所以不应该有任何遗留加密问题。
2.本期发生相当罕见(< 10%的时间),所以代码本身应该健全
3.托管是在win7x64 IIS 7.5在当地,和天蓝色 - 发生在这两个地方
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

新会话启动时是否显示登录屏幕? 这两个Web应用程序的会话超时设置如何? 他们有不同的应用程序池吗?这些泳池是否有回收设置? 确实可以终止站点的性能计数器并记录站点的相关性能计数器,如会话超时,重新编译? – Siraf 2013-04-11 20:07:28

+0

听起来像绝对不是代码问题。如果您使用Cookie或应用程序池回收,我的猜测可能是Cookie超时。在认证逻辑中添加一些跟踪,发生问题时是否执行SSO方法? – Sergey 2013-04-16 01:26:47

回答

0

我想我终于解决了它(我们只知道肯定,一旦我们有一个很好的,同时不复发因为它是间歇反正)

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

0

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

1

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