Ich habe eine App für eine einzelne Seite - mehr oder weniger basierend auf der MVC5 SPA-Vorlage -, die Inhaber-Token zur Authentifizierung verwendet.
Die Site verfügt auch über einige herkömmliche MVC-Seiten, die gesichert werden müssen, jedoch die Cookie-Authentifizierung verwenden .
In Startup.Auth kann ich beide Arten der Autorisierung aktivieren:
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOAuthBearerTokens(OAuthOptions);
Dies scheint jedoch einen Nebeneffekt zu haben, da bei jedem Senden einer AJAX-Anforderung vom SPA sowohl das Inhaber-Token im Header als auch das Cookie gesendet werden .
Das Verhalten, das ich wirklich möchte, ist, dass nur das Inhaber-Token für WebAPI-Aufrufe und nur das Cookie für MVC-Aufrufe verwendet wird.
Ich möchte auch, dass die MVC-Aufrufe auf eine Anmeldeseite umleiten, wenn sie nicht autorisiert sind (als CookieAuthenticationOption festgelegt), aber ich möchte natürlich nicht, dass dies beim Ausführen eines API-Aufrufs geschieht.
Gibt es eine Möglichkeit, diese Art der Authentifizierung im gemischten Modus in einer Anwendung durchzuführen? Vielleicht durch einen Pfad- / Routenfilter?
quelle
Install-Package Microsoft.AspNet.WebApi.Owin
Sie können dem Cookie ein JWT-Token hinzufügen (hier lautet der Name meines JWT-Token-Cookies "access_token") und nur eine solche Middleware erstellen
public class JwtCookieMiddleware { private readonly RequestDelegate _next; public JwtCookieMiddleware(RequestDelegate next) { _next = next; } public Task Invoke(HttpContext ctx) { if (ctx.Request.Cookies.TryGetValue("access_token", out var accessToken)) { if (!string.IsNullOrEmpty(accessToken)) { string bearerToken = String.Format("Bearer {0}", accessToken); ctx.Request.Headers.Add("Authorization",bearerToken); } } return this._next(ctx); } } public static class JwtCookieMiddlewareExtensions { public static IApplicationBuilder UseJwtCookie(this IApplicationBuilder build) { return build.UseMiddleware<JwtCookieMiddleware>(); } }
Und Sie müssen die Middleware beim Start wie folgt verwenden:
app.UseJwtCookie(); app.UseAuthentification(); app.UseMvc();
Der obige Code fügt dem HTTP-Anforderungsheader ein JWT-Token hinzu, wenn diese Anforderung ein Token-Cookie enthält.
quelle