ASP.NET MVC授权属性在IE和FireFox中表现不同

时间:2010-12-13 06:19:34

标签: asp.net-mvc asp.net-mvc-2 authorization

首先要做的事情是:这只是一个样本。这不是一个问题,这是否是一种有效的身份验证方式。

基本上,我的奇怪行为取决于所使用的浏览器。在Firefox中,一切都按预期工作,但在IE上,即使授权失败,控制器操作仍然会触发。

我有一个ASP.NET MVC测试站点,其中SecureController类继承自标准Controller类,并带有以下相关代码:

[AuthorizeByToken]
public class SecureController : Contrller
 protected override void OnAuthorization(AuthorizationContext filterContext)
 {
     // Check for presence of encoded session string
     if (filterContext == null) throw new ArgumentNullException("filterContext null");
     if (filterContext.HttpContext == null) throw new ArgumentNullException("httpContext null");
     if (filterContext.HttpContext.Request["TestToken"] == null) return;

     // Complete authorization
     FormsAuthentication.SetAuthCookie(csmSession.CSMUser.userName, true);
     base.OnAuthorization(filterContext);
 }

还有一个基于AuthorizeAttribute的AuthorizeByTokenAttribute属性,如下所示:

public class AuthorizeByTokenAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.Result = new RedirectResult("/");
        filterContext.ActionDescriptor = null;
        base.HandleUnauthorizedRequest(filterContext);
    }

}

现在,例如,当您访问http://testsite/TestSecureController/Index时,它在Firefox中按预期工作。它进入授权代码,失败,并重定向到根。在IE中它进入授权代码,仍然失败,下一步是TestSecureController的Index()动作正在运行。

任何人都可以提供一些有关此类内容与浏览器相关的原因吗?

1 个答案:

答案 0 :(得分:3)

我使用几种不同的方法测试了您的Uri路由方案,并将其作为一个问题排除在外。这在两个浏览器中都是等效的。我对这种事情极其偏执。

因此,我倾向于认为它的cookie行为或状态因两个浏览器实例而异。请尝试以下方法:

  1. 尝试使用IE8 / IE9中的InPrivate会话对您的表单进行授权 - 这是一个无cookie会话,并且应该在正常的失败后路由行为中失败。我们试图通过此测试消除的可能是您在IE会话中使用脏cookie并在Firefox中使用干净的cookie。如果此测试成功,请继续执行步骤2.如果失败,请参阅步骤3.
  2. 尝试使用标准IE实例对您的控制器进行授权;如果失败,请擦除所有Cookie并重试。如果失败,请参阅步骤3.
  3. 如果这两个测试都失败了,那么我们需要检查Firefox和IE中的cookie是否相同。您可以尝试使用http://ncookiereader.sourceforge.net/之类的内容来比较您的网站在Firefox和IE中发布的Cookie,但是打开Cookie集合并在Notepad ++中进行区分可能更简单。您的cookie的内容将被加密,并且它们可能包含不同的身份验证票据,大概是因为您在两个不同的IIS会话上运行,因此为了使生活更轻松仅用于调试我建议启用解密一个选项,以便您可以使用Web.config中的此代码段以纯文本格式查看您的Cookie:<authentication mode="Forms"> <forms loginUrl="~/Account/LogOn" timeout="2880" protection="None" /> </authentication> - 如果您的Cookie内容与授权凭证不同,请转到http://aaronstannard.com/并发送给我通过联系表格发送电子邮件。如果您的cookie内容相同,请继续执行步骤4.
  4. 此时,我开始在授权过滤器中查找未处理的异常,并且我将使用Wireshark来查看IE和Firefox发送的HTTP请求是否有任何重大差异。如果您发现任何问题,请告诉我们。