new net hubconnectionbuilder example aspnet asp addjwtbearer asp.net-mvc asp.net-web-api oauth-2.0 owin

asp.net-mvc - net - signalr vs signalr core



Usar tokens de portador y autenticación de cookie juntos (2)

Creo que resolví esto:

Inicio. Auth está conectando el oleoducto OWIN, por lo que es correcto incluir Cookies y Tokens allí. Pero un cambio en las opciones de cookies especifica el tipo de autenticación al que debe aplicarse:

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

Entonces necesité configurar WebAPI para usar solo tokens:

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

Esto parece lograr lo que quiero. WebAPI solo utiliza tokens de portador y no cookies, y algunas páginas convencionales de MVC usan cookies una vez que inician sesión (usando el AuthenticationManager).

Tengo una aplicación de una sola página, más o menos basada en la plantilla de MVC5 SPA, que utiliza tokens de portador para la autenticación.

El sitio también tiene un par de páginas convencionales de MVC que deben protegerse, pero usando autenticación de cookies .

En Startup.Auth puedo habilitar ambos tipos de autorización:

app.UseCookieAuthentication(new CookieAuthenticationOptions()); app.UseOAuthBearerTokens(OAuthOptions);

Sin embargo, esto parece tener un efecto secundario en que cada vez que se envía una solicitud AJAX desde el SPA, envía tanto el token del portador en el encabezado como la cookie.

Mientras que el comportamiento que realmente quiero es que solo el token portador se use para llamadas WebAPI, y solo la cookie para llamadas MVC.

También me gustaría que las llamadas MVC redirijan a una página de inicio de sesión cuando no estén autorizadas (configuradas como CookieAuthenticationOption), pero obviamente no quiero que esto suceda cuando realizo una llamada a la API.

¿Hay alguna forma de tener este tipo de autenticación en modo mixto dentro de una aplicación? ¿Quizás a través de un filtro ruta / ruta?


puedes agregar el token jwt a la cookie (aquí mi nombre de jwt token cookie es "access_token") en modo http-only, y crear un middleware como este

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>(); } }

Y necesita usar el middleware en el arranque de esta manera:

app.UseJwtCookie(); app.UseAuthentification(); app.UseMvc();

el código anterior agregará el token jwt al encabezado de solicitud http si esta solicitud con una cookie token;