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.
ich schlage vor, Sie ein Problem bei https://github.com/aspnet/identity öffnen –
gute Idee: es hier gepostet: https://github.com/aspnet/Identity/issues/604 –
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 –