2016-08-06 5 views
9

Ich versuche ASP.NET Core Identity 401 zu erhalten, wenn ein Benutzer nicht angemeldet ist. Ich habe ein [Authorize] Attribut zu meiner Methode hinzugefügt und anstatt 401 zurückgegeben, gibt 302 zurück. Ich habe eine Tonne probiert von Vorschlägen scheint aber nichts zu funktionieren, einschließlich services.Configure und app.UseCookieAuthentication Einstellung LoginPath bis null oder PathString.Empty.Wie 401 anstelle von 302 in ASP.NET Core zurückgegeben werden?

Antwort

11

Ab ASP.NET Core-2.x:

services.ConfigureApplicationCookie(options => 
{ 
    options.Events.OnRedirectToLogin = context => 
    { 
     context.Response.StatusCode = 401;  
     return Task.CompletedTask; 
    }; 
}); 
+0

auch, Ihr Anruf bei services.AddIdentity muss vor diesem –

5

Okay nach dem Graben in der asp.net core unit tests fand ich endlich eine funktionierende Lösung. Sie haben die folgende auf Ihren Anruf zu services.AddIdentity

services.AddIdentity<ApplicationUser, IdentityRole>(o => { 
    o.Cookies.ApplicationCookie.AutomaticChallenge = false; 
}); 
+0

Leitet dies den Benutzer noch immer auf die Anmeldeseite um? Ich erhalte sehr viel Traffic auf Seiten, die beim Klicken aufgrund der 302 auf die Anmeldeseite umgeleitet werden. Ich möchte immer noch, dass das funktioniert, aber ich möchte, dass alle Bots diesen Aufruf nicht ausführen, so dass sie ihn nie aufrufen wieder (a 401/403). Ein 302 wird ihnen immer noch sagen, dass sie es weiterhin anrufen sollen. (Dies ist für diejenigen, die die robots.txt-Datei nicht berücksichtigen, wo ich das URL-Muster ausdrücklich "verbiete") – ganders

+1

@ganders Nein. Wenn Sie möchten, dass sich Ihre App auf eine bestimmte Weise auf 401 verhält, werden Sie muss selbst damit umgehen. Normalerweise sollte ein 401 einen WWW-Authenticate-Header enthalten, der beschreibt, wie man sich authentifiziert. –

+0

'WWW-Authenticate'-Header muss auf 401 bereitgestellt werden. ' Wenn die geschützte Ressourcenanforderung keine Authentifizierungsdaten enthält oder kein Zugriffstoken enthält, das den Zugriff auf die geschützte Ressource ermöglicht, MUSS der Ressourcenserver das HTTP "WWW -Authenticate "Response-Header-Feld" – urbanhusky

5
services.Configure<IdentityOptions>(options => 
{ 
    options.Cookies.ApplicationCookie.LoginPath = new PathString("/"); 
    options.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents() 
    { 
     OnRedirectToLogin = context => 
     { 
     if (context.Request.Path.Value.StartsWith("/api")) 
     { 
      context.Response.Clear(); 
      context.Response.StatusCode = 401; 
      return Task.FromResult(0); 
     } 
     context.Response.Redirect(context.RedirectUri); 
     return Task.FromResult(0); 
     } 
    }; 
}); 

Quelle hinzuzufügen:

https://www.illucit.com/blog/2016/04/asp-net-5-identity-302-redirect-vs-401-unauthorized-for-api-ajax-requests/

+0

Dies ist genau das, was ich brauchte. Vielen Dank! –

+1

leider funktioniert dies nicht auf Identität Kern 2 –

1

Für Asp.net Core 2 NUTZUNG DIESES STATT

services.ConfigureApplicationCookie(options => 
{ 
    options.LoginPath = new PathString("/Account/Login"); 
    options.LogoutPath = new PathString("/Account/Logout"); 

    options.Events.OnRedirectToLogin = context => 
    { 
     if (context.Request.Path.StartsWithSegments("/api") 
      && context.Response.StatusCode == StatusCodes.Status200OK) 
     { 
      context.Response.Clear(); 
      context.Response.StatusCode = StatusCodes.Status401Unauthorized; 
      return Task.FromResult<object>(null); 
     } 
     context.Response.Redirect(context.RedirectUri); 
     return Task.FromResult<object>(null); 
    }; 
}); 
+0

Diese Lösung ist in Core 2 perfekt funktioniert! Vielen Dank –

0

Wenn der Request-Header X-Requested-With enthält: statt 302

private static bool IsAjaxRequest(HttpRequest request) 
    { 
     return string.Equals(request.Query["X-Requested-With"], "XMLHttpRequest", StringComparison.Ordinal) || 
      string.Equals(request.Headers["X-Requested-With"], "XMLHttpRequest", StringComparison.Ordinal); 
    } 

Siehe auf GitHub XMLHttpRequest der Code-Status wird 401 sein: https://github.com/aspnet/Security/blob/5de25bb11cfb2bf60d05ea2be36e80d86b38d18b/src/Microsoft.AspNetCore.Authentication.Cookies/Events/CookieAuthenticationEvents.cs#L40-L52

Verwandte Themen