asp.net-mvc - tutorial - signalr stream




Bearer Tokens und Cookie-Authentifizierung zusammen verwenden (2)

Ich denke, ich habe das herausgefunden:

Startup.Auth verkabelt die OWIN-Pipeline, daher ist es richtig, dort Cookies und Token einzubeziehen. Eine Änderung an den Cookie-Optionen gibt jedoch den Authentifizierungstyp an, auf den es angewendet werden sollte:

CookieOptions = new CookieAuthenticationOptions
{
  AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie   
};

Dann musste ich WebAPI konfigurieren, um nur Token zu verwenden:

public static void Configure(HttpConfiguration config)
{
   // Configure Web API to use only bearer token authentication.
   config.SuppressDefaultHostAuthentication();
   config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
}

Dies scheint zu erreichen, was ich will. WebAPI verwendet nur Träger-Token und keine Cookies, und einige herkömmliche MVC-Seiten verwenden Cookies, sobald sie eingeloggt sind (mit dem AuthenticationManager).

Ich habe eine einzelne Seite App - mehr oder weniger auf der MVC5 SPA Vorlage basiert - mit Bearer Token für die Authentifizierung.

Die Seite hat auch ein paar konventionelle MVC-Seiten, die gesichert werden müssen, aber 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, dass jedes Mal, wenn eine AJAX-Anforderung von der SPA gesendet wird, sowohl das Träger-Token in der Kopfzeile als auch der Cookie gesendet wird.

Wohingegen das Verhalten, das ich wirklich will, ist, dass nur das Bearer-Token für WebAPI-Aufrufe und nur das Cookie für MVC-Aufrufe verwendet wird.

Ich möchte auch, dass die MVC-Anrufe zu einer Login-Seite umleiten, wenn sie nicht autorisiert sind (als CookieAuthenticationOption), aber offensichtlich möchte ich nicht, dass dies passiert, wenn ich einen API-Aufruf mache.

Gibt es eine Möglichkeit, diese Art von Mixed-Mode-Authentifizierung in einer Anwendung zu haben? Vielleicht durch einen Pfad- / Routenfilter?


Sie können den JWT-Token im HTTP-Only-Modus zu einem Cookie hinzufügen (hier ist mein JWT-Token-Cookie-Name "access_token") und eine Middleware wie diese 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 das JWT-Token zum http-Anfrage-Header hinzu, wenn diese Anfrage mit einem Token-Cookie erfolgt;







owin