8

Ich habe versucht, die Umleitung zu verhindern, wenn ich ein NotAuthorized IActionResult von einem Controller zurückgeben, aber unabhängig von meinen Versuchen, NotAuthorized wird in eine Umleitung übersetzt.mvc6 nicht autorisierte Ergebnisse in Redirect stattdessen

Ich habe versucht, was erwähnt wird here (gleiche Ausgabe, mit älteren Beta-Framework, ich benutze 1.0.0-rc1-Finale). Ich habe den Notifications-Namespace nicht (wurde in RC1-final entfernt).

Dies ist meine Anmeldung Controller:

[HttpPost] 
    [AllowAnonymous] 
    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) 
    { 
     if (ModelState.IsValid) 
     { 
      var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false); 
      if (result.Succeeded) 
      { 
       return Ok(model); 
      } 
      if (result.IsLockedOut) 
      { 
       return new HttpStatusCodeResult((int)HttpStatusCode.Forbidden); 
      } 
      else 
      { 
       return HttpUnauthorized(); 
      } 
     } 
     return HttpUnauthorized(); 
    } 

In Startup.cs Ich habe über diese versucht Variationen:

 services.Configure<CookieAuthenticationOptions>(o => 
     { 
      o.LoginPath = PathString.Empty; 
      o.ReturnUrlParameter = PathString.Empty; 
      o.AutomaticChallenge = false; 
     }); 

Jedesmal, wenn ein Login fehlschlägt (bitte ignorieren, dass das Passwort auf Ok zurückgegeben wird) und sollte zu einer leeren 401 Seite führen, bekomme ich stattdessen eine Umleitung zu/Account/Login. Was ist der Trick hier?

+0

Versuchen Sie dies auf einer Anmeldeseite? oder ist es für die REST-API-Authentifizierung? Wenn dies für eine API der Fall ist, sehen Sie sich dies an: http://wildermuth.com/2015/9/10/ASP_NET_5_Identity_and_REST_APIs – drinck

+0

REST-API, Ihr Link setzt voraus, dass der Namespace für Benachrichtigungen zwar existiert, aber entfernt wurde. Die verknüpfte Lösung funktioniert nicht mehr. – galmok

Antwort

9

Die Lösung wird nicht CookieAuthenticationOptions direkt zu konfigurieren, aber es über IdentityOptions wie folgt tun:

 services.Configure<IdentityOptions>(o => 
     { 
      o.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents() 
      { 
       OnRedirectToLogin = ctx => 
       { 
        if (ctx.Response.StatusCode == (int)HttpStatusCode.Unauthorized) 
        { 
         return Task.FromResult<object>(null); 
        } 
        ctx.Response.Redirect(ctx.RedirectUri); 
        return Task.FromResult<object>(null); 
       } 
      }; 
     }); 
+5

Die einfache Verwendung von 'o.Cookies.ApplicationCookie.AutomaticChallenge = false;' war genug für mich (ich wollte nie eine Weiterleitung). –

+0

@ PeppeL-G Dies ist das einzige, was ich zur Arbeit bekommen könnte. Vielen Dank. –

8

Genommen von hier (Shawn Wildermuth -> ASP.NET 5 Identität und REST-APIs -> Kommentar von „Mehdi Hanafi“) und getestet, um die API mit Postman

config.Cookies.ApplicationCookie.Events = new CookieAuthenticationEvents() 
{ 
    OnRedirectToLogin = 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); 
     } 
    } 
}; 
+0

Wie bekommen Sie es in erster Linie umleiten. Ich wünsche Gott, ich könnte meinen umleiten. Es wird es nicht tun. – Sam

2

Wenn Sie einige Seiten haben, für die die Umleitung erwünscht ist, und andere URLs, die nicht eine Umleitung haben sollte, diese Frage nach einer Lösung sehen, die die Standard-Weiterleitung verwendet Logik nur für Nicht-API-URLs:

Suppress redirect on API URLs in ASP.NET Core

1

von Identity 2.0, würden Sie hinzufügen müssen:

using Microsoft.AspNetCore.Authentication.Cookies; 

und in ConfigureServices:

services.ConfigureApplicationCookie(options => 
{ 
    options.Events = new CookieAuthenticationEvents 
    { 
     OnRedirectToLogin = (x => 
     { 
      if (x.Request.Path.StartsWithSegments("/api") && x.Response.StatusCode == 200) 
       x.Response.StatusCode = 401; 

      return Task.CompletedTask; 
     }), 
     OnRedirectToAccessDenied = (x => 
     { 
      if (x.Request.Path.StartsWithSegments("/api") && x.Response.StatusCode == 200) 
       x.Response.StatusCode = 403; 

      return Task.CompletedTask; 
     }) 
    }; 
}); 

die Segmente Überprüfung sollte natürlich auf Ihre Routen eingestellt werden .