ASP.NET MVC5 WebAPI2 Предотвращение несанкционированного перенаправления на страницу входа

Почему мой контроллер WebApi2 перенаправляет меня на страницу входа, когда я возвращаю Unauthorized()? То же самое происходит, когда я использую атрибут [Авторизовать]. Разве контроллер не должен возвращать результат Json или XML, как запрошено в Content-Type? Перенаправление меня на страницу входа — пустая трата ресурсов и совершенно бесполезно для клиента приложения.

Я посмотрел в Интернете. Кажется, модуль аутентификации форм захватывает мой ответ 401 и преобразует его в 302. Это странно, потому что мой режим аутентификации «нет» (не формы). Более того, я читал, что эта «функция» была исправлена ​​в .Net 4.5 (которую я использую).

Я попытался переопределить свой Application_EndRequest в моем Global.asax.cs

        protected void Application_EndRequest()
    {
        var context = new HttpContextWrapper(Context);
        // If we're an ajax request, and doing a 302, then we actually need to do a 401
        if (Context.Response.StatusCode == 302 && context.Request.ContentType.StartsWith("application"))
        {
            Context.Response.Clear();
            Context.Response.ClearContent();
            Context.Response.StatusCode = 401;
            context.Response.RedirectLocation = null;
            Context.Response.End();
        }
    }

Это не сработало (вернуло HTML-страницу IIS). Какой следующий шаг ?


person nVentimiglia    schedule 07.11.2013    source источник
comment
возможный дубликат OWIN: неавторизованный вызов webapi, скорее возвращающий страницу входа чем 401   -  person angularsen    schedule 23.06.2015


Ответы (1)


Использование файлов cookie ПО промежуточного слоя аутентификации с веб-API и кодами ответов 401 Его можно настроить, переопределив событие OnApplyRedirect в вашем CookieAuthenticationProvider. Читайте блог для дальнейшего объяснения.

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
   AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
   LoginPath = new PathString("/Account/Login"),
   Provider = new CookieAuthenticationProvider
   {
      OnApplyRedirect = ctx =>
      {
         if (!IsAjaxRequest(ctx.Request))
         {
            ctx.Response.Redirect(ctx.RedirectUri);
         }
     }
   }
});

И в том же классе:

private static bool IsAjaxRequest(IOwinRequest request)
{
   IReadableStringCollection query = request.Query;
   if ((query != null) && (query["X-Requested-With"] == "XMLHttpRequest"))
   {
      return true;
   }
   IHeaderDictionary headers = request.Headers;
   return ((headers != null) && (headers["X-Requested-With"] == "XMLHttpRequest"));
}
person Bcelik    schedule 07.11.2013
comment
Спасибо, ты лучший. - person nVentimiglia; 08.11.2013
comment
Не удалось заставить SuppressFormsAuthenticationRedirect работать в проекте как с mvc, так и с webapi, использование OnApplyRedirect для проверки заголовка безопасности помогло! - person Trax72; 16.03.2021