Атрибут ASP.NET MVC Authorize ведет себя по-разному в IE и FireFox - PullRequest
3 голосов
/ 13 декабря 2010

Перво-наперво: это только образец. Вопрос не в том, является ли это действительным способом аутентификации.

По сути, я получаю странное поведение, которое зависит от используемого браузера. В 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);
 }

Существует также атрибут AuthorizeByTokenAttribute, основанный на AuthorizeAttribute, например:

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 он входит в код авторизации, по-прежнему происходит сбой, и следующим шагом является выполнение действия Index () TestSecureController.

Может кто-нибудь предложить некоторое понимание того, почему что-то подобное зависит от браузера?

1 Ответ

3 голосов
/ 14 декабря 2010

Я протестировал вашу схему маршрутизации Uri, используя несколько различных методов, и устранил это как проблему. Это работает одинаково в обоих браузерах. Я ультра-параноик в подобных вещах.

Поэтому я склонен думать, что поведение или состояние файлов cookie различаются в двух ваших браузерах. Попробуйте следующее:

  1. Попробуйте авторизоваться для вашей формы, используя сеанс InPrivate в IE8 / IE9 - это сеанс без cookie-файлов, который должен завершиться с ошибкой при обычной маршрутизации после сбоя. В этом тесте мы пытаемся устранить то, что у вас есть грязные куки во время сеанса IE, а чистые - в Firefox. Если этот тест пройден успешно, перейдите к шагу 2. Если он не пройден, см. Шаг 3.
  2. Попробуйте авторизоваться на вашем контроллере, используя ваш стандартный экземпляр IE; Если это не удается, вытрите все свои куки и попробуйте снова. Если это не удается, см. Шаг 3.
  3. Если оба этих теста не пройдены, мы должны проверить, являются ли файлы cookie в Firefox и IE эквивалентными. Вы можете попробовать использовать что-то вроде http://ncookiereader.sourceforge.net/ для сравнения файлов cookie, которые выдает ваш сайт в Firefox и IE, но может быть проще просто открыть коллекцию файлов cookie и просмотреть их в Notepad ++. Содержимое вашего файла cookie будет зашифровано, и оно может включать разные билеты проверки подлинности, предположительно, потому что вы работаете в двух разных сеансах IIS, поэтому для упрощения работы только для целей отладки Я рекомендую включить расшифровку как чтобы вы могли просматривать файлы cookie в виде открытого текста, используя этот фрагмент в файле Web.config: <authentication mode="Forms"> <forms loginUrl="~/Account/LogOn" timeout="2880" protection="None" /> </authentication> - если содержимое ваших файлов cookie существенно отличается, кроме только билета проверки подлинности, перейдите на http://aaronstannard.com/ и отправьте мне электронное письмо через контактную форму. Если содержимое вашего cookie-файла эквивалентно, перейдите к шагу 4.
  4. На этом этапе я начал бы искать необработанные исключения в вашем фильтре авторизации и использовал бы Wireshark, чтобы увидеть, отличаются ли HTTP-запросы, отправляемые IE и Firefox, каким-либо существенным образом. Дайте нам знать, если найдете что-нибудь.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...