2015-12-07 11 views
5

Mam witrynę ASP.net 5.0 (MVC 6) i używam tej strony również w niektórych aplikacjach mobilnych. Mam kontroler, który zwraca dane json.ASP.net 5.0 - WebAPI Authorize & ErrorCode 302 zamiast 401

Użytkownik musi uwierzytelnić, aby zobaczyć te dane, więc używam atrybutu [Autoryzuj] dla kontrolera.

Oczekiwano, że otrzymam błąd 401 w przypadku nieautoryzowanych żądań nur Otrzymuję przekierowanie (302) na stronę logowania. W kliencie mobilnym ustaw nagłówek tak, aby akceptował tylko dane "application/json", ale nadal dostaję przekierowanie do strony logowania.

Opracowałem rozwiązanie, które działa, ale nie jestem z niego zadowolony. Działa, ale jest to rodzaj hackowania.

Czy istnieje lepsze rozwiązanie tego problemu?

Oto moje rozwiązanie (Configure metoda w klasie startowego)

 //....Some Code 
     app.Use(async (context, next) => 
     { 
      await next.Invoke(); 

      if (context.Response.StatusCode == 302) 
      { 
       StringValues contentType; 
       if (context.Request.Headers.TryGetValue("Accept", out contentType) 
        && contentType.Contains("application/json")) 
       { 
        context.Response.StatusCode = 401; 
        if (env.IsDevelopment()) 
         await context.Response.WriteAsync("No Access"); 
       } 
      } 
     }); 
     app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "default", 
       template: "{controller=Home}/{action=Index}/{id?}"); 
     }); 
+0

Zgodnie z https://aspnet.uservoice.com/forums/147201-asp-net-web-api/suggestions/2856315-add-option-to-return-401-nie-autoryzowane-wprowadzenie- naprawiono –

Odpowiedz

2

ten powinien być rozwiązany przez klienta. Klient musi wysłać nagłówek X-Requested-With o wartości XMLHttpRequest.

więc powinno to być częścią sekcji nagłówków w żądaniu HTTP:

X-Requested-With: XMLHttpRequest 

Teraz dostaniesz 401 bez hacków.

+0

To nie działa z rdzeniem dotnet, musisz dodać niestandardowe zdarzenie do oprogramowania pośredniczącego uwierzytelniania (np. CookieAuthenticationMiddleware lub OpenIdConnectMiddleware), aby wykryć nagłówek 'X-Requested-With: XMLHttpRequest' i zwrócić 401 samodzielnie. – dstj

+0

Idealny. Tego właśnie szukałem. Dzięki. – JRoppert