2013-11-07 2 views
4

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

Ive огляделся по сторонам. Кажется, что модуль аутентификации форм захватывает мой ответ 401 и преобразует его в 302. Это странно, потому что мой режим аутентификации «none» (а не формы). Более того, я прочитал, что эта функция была исправлена ​​в .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(); 
     } 
    } 

Это не очень хорошо работает (возвратил страницу IIS Html). Каким будет следующий шаг ?

+0

возможно дубликат [Owin: несанкционированный WebAPI вызов возвращение Логин страницы, а не 401] (http://stackoverflow.com/questions/20149750/owin-unauthorised -webapi-call-returns-login-page-rather-than-401) – angularsen

ответ

8

Using cookie authentication middleware with Web API and 401 response codes Вы можете настроить его, переопределив событие 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")); 
} 
+0

Спасибо, ваш лучший. – nVentimiglia

Смежные вопросы