Asp.net mvc ASP.NET MVC Authorize属性在IE和FireFox中的行为不同

Asp.net mvc ASP.NET MVC Authorize属性在IE和FireFox中的行为不同,asp.net-mvc,asp.net-mvc-2,authorization,Asp.net Mvc,Asp.net Mvc 2,Authorization,第一件事:这只是一个样本。这不是一个关于这是否是进行身份验证的有效方法的问题 基本上,我有一些奇怪的行为,这取决于所使用的浏览器。在Firefox中,一切都如预期的那样工作,但在IE上,即使授权失败,仍会触发相关的控制器操作 我设置了一个ASP.NET MVC测试站点,其中SecureController类继承自标准控制器类,并具有以下相关代码: [AuthorizeByToken] public class SecureController : Contrller protected ove

第一件事:这只是一个样本。这不是一个关于这是否是进行身份验证的有效方法的问题

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

我设置了一个ASP.NET MVC测试站点,其中SecureController类继承自标准控制器类,并具有以下相关代码:

[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);
    }

}
例如,当您访问它时,它在Firefox中的工作方式与预期一致。它进入授权代码,失败并重定向到根目录。在IE中,它进入授权代码,仍然失败,下一步是运行TestSecureController的Index()操作


有人能提供一些关于为什么这样的东西会依赖于浏览器的见解吗?

我使用几种不同的方法测试了您的Uri路由方案,并消除了这一问题。这在两种浏览器上都是等效的。我对这类事情极度偏执

因此,我倾向于认为是cookie的行为或状态在两个浏览器实例中有所不同。请尝试以下操作:

  • 尝试使用IE8/IE9中的InPrivate会话对您的表单进行授权-这是一个无Cookie会话,应该会以正常的失败后路由行为失败。我们试图通过此测试消除IE会话中存在脏cookie而Firefox中存在干净cookie的可能性。如果此测试成功,请转至步骤2。如果失败,请参阅步骤3
  • 尝试使用标准IE实例对控制器进行授权;如果失败,请擦除所有cookie并重试。如果失败,请参阅步骤3
  • 如果这两个测试都失败了,那么我们需要检查Firefox和IE中的cookie是否等效。您可以尝试使用类似的方法来比较Firefox和IE中您的站点问题的cookie,但只需打开cookies集合并在Notepad++中区分它们可能会更简单。cookie的内容将被加密,它们可能包含不同的身份验证票证,可能是因为您在两个不同的IIS会话上运行,因此,为了使调试变得更简单,我建议启用解密作为一个选项,这样您就可以在Web.config:
    中使用此代码片段以明文形式查看cookie,并通过联系人表单向我发送电子邮件。如果cookie的内容相同,请转至步骤4
  • 此时,我将开始在您的授权过滤器中查找未处理的异常,并使用Wireshark查看IE和Firefox发送的HTTP请求是否存在任何主要差异。如果你发现什么,请告诉我们

  • 有几个问题:1。Index()操作方法不是这个控制器的根吗?2.您是否试图重定向到整个网站的根目录,而不是使用此属性修饰的任何SecureContoller?因此,您建议RedirectResult(“/”)重定向到控制器的根目录,而不是网站?我不会想到它会以这种方式工作,或者它会破坏路由的工作方式。如果我错了,请纠正我。无论如何,这肯定是一种完全包含服务器的行为,不会受到浏览器选择的影响?我只是想在打开引擎盖并回答您的问题之前了解您的目标。我的直觉是,您的问题存在于两个方面之一:每个浏览器如何处理相对URI,以及Cookie行为如何在每个浏览器中工作。我现在正在做一个实验来消除或确认第1项。是的,URI不是问题所在——完全是服务器端的问题。