6

In einer ASP.NET 5 Anwendung I konfiguriert MVC und Identität Rahmen wie folgt aus:ASP.NET Unbefugter Zugriff auf einen Controller sollte 401 zurückgeben statt 200 und die Login-Seite

app.UseMvc(config=>{ 
    config.MapRoute("Default", "{controller}/{action}/{id?}", new 
      { 
       controller = "Home", 
       action = "Index" 
      }); 
}); 

und das Hinzufügen von Identity Services:

services.AddAuthentication(); 
    services.AddAuthorization(); 

    services.AddIdentity<CrmUser, CrmUserRole>(config => { 
     config.User.RequireUniqueEmail = true; 
      }) 
      .AddUserStore<MongoUserStore>() 
      .AddRoleStore<MongoUserStore>() 
      .AddDefaultTokenProviders(); 

und

app.UseIdentity() 
    .UseCookieAuthentication(i => { i.LoginPath = "/Account/Login";}); 

Das Beispiel ist wie folgt definiert:

public class MyApiController : Microsoft.AspNet.Mvc.Controller 
{ 
    [Authorize] 
    public async Task<ActionResult> Foo() 
    { 
     return Ok(); 
    } 
} 

Dies funktioniert gut, aber ich habe auch einige Controller, die ich in einer API Weise verwenden möchten. In ASP.NET 5 haben alle dieselbe Basisklasse, sodass zwischen API und View-Controllern kein Unterschied besteht.

Als Ergebnis beim Aufruf einer nicht autorisierten API, die eine Autorisierung erfordert, erhalte ich eine und die Login-Seite anstelle einer HTTP 401.

In einem Blog-Eintrag von Shawn Wildermuth fand ich diesen

services.AddCookieAuthentication(config => 
    { 
     config.LoginPath = "/Auth/Login"; 
     config.Events = new CookieAuthenticationEvents() 
     { 
      OnRedirect = ctx => 
      { 
       if (ctx.Request.Path.StartsWithSegments("/api") && 
       ctx.Response.StatusCode == 200) 
       { 
        ctx.Response.StatusCode =  (int)HttpStatusCode.Unauthorized; 
        return Task.FromResult<object>(null); 
       } 
       else 
       { 
        ctx.Response.Redirect(ctx.RedirectUri); 
        return Task.FromResult<object>(null); 
       } 
      } 
     }; 
    }); 

Aber soll das wirklich die erwartete Art und Weise, dies zu tun? Für mich riecht das ein wenig.

+0

ich schlage vor, Sie ein Problem bei https://github.com/aspnet/identity öffnen –

+0

gute Idee: es hier gepostet: https://github.com/aspnet/Identity/issues/604 –

+2

Sie erhalten eine Weiterleitung, weil das Cookie-Authentifizierungssystem die AuthorizationChallenge durch Weiterleiten an den von Ihnen angegebenen Pfad behandelt. Die Controller sollten NICHT in der Lage sein, dieses Verhalten direkt zu beeinflussen und die Cookie-Authentifizierung an den Controller (oder sogar MVC) zu koppeln ist ein schlechterer Geruch. Sie müssen den OnRedirect wie oben behandeln, aber wir verwenden andere Metadaten auf die Anfrage, um eine Entscheidung zu treffen, wie die Annahme Kopfzeile (application/json, text/html), oder ist Ajax Anfrage –

Antwort

2

Dieses Problem wurde in RC1 behoben.

prüfen GitHub Kommentar hier ein: Issue

Um zu RC1 zu aktualisieren, zu http://get.asp.net gehen.

Um noch sicherer zu sein, können Sie auch Ihren Ordner %userprofile%\.dnx\ löschen, bevor Sie die neueste Version erhalten.

+0

Wie ist das eine Antwort? Es ist ein Link zu der gleichen Frage, die das OP in einem Kommentar veröffentlicht hat, dass sie auf einer anderen Website angesprochen haben. 1) Dies ist eine Link-Only-Antwort 2) Der Link hat kein Codebeispiel, sondern nur einen Link zu einem Git-Commit, nach dem Sie gefragt haben (es sei denn, jemand wollte Sie mit dem gleichen Benutzernamen und Bild imitieren) – ono2012

+0

While Dieser Link kann die Frage beantworten, es ist besser, die wesentlichen Teile der Antwort hier einzubeziehen und den Link als Referenz zur Verfügung zu stellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/16825151) – Hackerman

0

Eine Lösung hierfür ist die Anforderung mit einem der folgenden Header senden:

[{"key":"X-Requested-With","value":"XMLHttpRequest"}] 

Hier ist ein Beispiel Postman mit ohne den Header 200 und Login-Webseite html zurück Screenshot of Postman not sending the header returns 200 and login webpage html]

Mit die Überschrift gibt 401 und keinen Inhalt zurück (es gibt kein Häkchen daneben) With the header returns 401 and no content

Die Beispielanwendung basiert auf der ASP.NET Core-Standardlösung mit individueller Benutzerauthentifizierung

Warum dies funktioniert: CookieAuthenticationEvents.OnRedirectToLogin() verwendet IsAjaxRequest(context.Request) zu entscheiden, ob eine 401 oder eine Umleitung zurückzukehren. Sie müssen also eine Kopfzeile haben, die IsAjaxRequest(context.Request) wahr zurückgibt. Es sieht so aus, als würden viele JavaScript-Bibliotheken dies automatisch für Sie hinzufügen, wenn Sie Ihre API über AJAX aufrufen, aber Sie verwenden sie möglicherweise nicht.

Verwandte Fragen Sie hilfreich

Dieses Verhalten war introduced als Folge eines request die OP in legte finden könnte (was sie unter erwähnen die Frage)

Link zum current Version von CookieAuthenticationEvents.cs zum Zeitpunkt des Schreibens.

0

One (Arbeit um) Option ist es, die coockie Optionen, damit Sie sich auf eine Controller-Aktion zu umleiten (nicht autorisierte) Ergebnis Rückkehr Leider bin ich antworten mein Telefon Ich werde versuchen, meine Antwort zu verbessern, wenn ich benutze mein PC ...

Verwandte Themen