¿Cómo usar JWT en la aplicación MVC para autenticación y autorización?

Planeé usar asp.net Identity 2.0 en la aplicación asp.net MVC para autenticación y autorización.

Refiriéndose al enlace a continuación

Token web JSON en ASP.NET Web API 2 usando Owin

Pude crear un token de acceso (JWT) para el usuario válido, es decir, cuando el usuario se conecta a la aplicación, validaré al usuario con el nombre y la contraseña, entonces emitiré un token web JSON para ese usuario válido.

Ahora, leo en algunos artículos que necesitamos pasar el token de portador en los encabezados por cada solicitud para validar al usuario para la autenticación. En MVC proporcionaremos el atributo Autorizar para los métodos que deben protegerse, como se muestra a continuación …

public class UserController : BaseHRAppController { [Authorize] public ActionResult Index() { return View(); } } 

Cómo decirle a mi aplicación MVC que use JWT para validar al Usuario.

Quiero hacer que mi aplicación MVC valide al usuario que usa JWT siempre que el usuario intente acceder al método con el atributo authorize. Como usaré las llamadas ajax en muchas páginas para acceder al método presente en el controlador de mvc, no creo que sea una buena forma de pasar el token en cada solicitud de Ajax. Necesito ayuda para lograr autenticación y autorización de manera eficiente usando la identidad asp.net en MVC applicaton.

Actualmente, no sé cómo usar este token JWT para autenticación y autorización en la aplicación mvc. Cualquier ayuda es apreciada Gracias.

Para que MVC entienda algo acerca de su JWT, básicamente debe contarlo :-). Primero, instale el paquete Jwt de nuget:

 Install-Package Microsoft.Owin.Security.Jwt 

A continuación, abra su archivo Startup.cs y agregue una nueva función que le dirá a MVC cómo consumir JWT. En principio, tu Startup se verá algo así como:

 using System.Configuration; using Microsoft.Owin; using Microsoft.Owin.Security; using Microsoft.Owin.Security.DataHandler.Encoder; using Microsoft.Owin.Security.Jwt; using Owin; [assembly: OwinStartupAttribute(typeof(TOMS.Frontend.Startup))] namespace TOMS.Frontend { public partial class Startup { public void Configuration(IAppBuilder app) { ConfigureAuth(app); ConfigureOAuthTokenConsumption(app); } private void ConfigureOAuthTokenConsumption(IAppBuilder app) { var issuer = ConfigurationManager.AppSettings["as:Issuer"]; var audienceId = ConfigurationManager.AppSettings["as:AudienceId"]; var audienceSecret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["as:AudienceSecret"]); // Api controllers with an [Authorize] attribute will be validated with JWT app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions { AuthenticationMode = AuthenticationMode.Active, AllowedAudiences = new[] { audienceId }, IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[] { new SymmetricKeyIssuerSecurityTokenProvider(issuer, audienceSecret) } }); } } } 

Notarás que estoy colocando issuer, audienceId y audienceSecret en mi archivo Web.config. (Esos valores deben coincidir con los de su servidor de recursos). Además, es posible que desee asegurarse de tener un System.IdentityModel.Tokens.Jwt actualizado en ejecución:

 Update-package System.IdentityModel.Tokens.Jwt 

Con esos conjuntos, puede decorar su Acción de controlador con el atributo [Autorizar] y jugar a la pelota.

Play ball, por supuesto, significa despedir tu pedido de tu javascript a tu acción de controlador protegido:

 //assuming you placed the token in a sessionStorage variable called tokenKey when it came back from your Authorization Server var token = sessionStorage.getItem(tokenKey); var headers = {}; if (token) { headers.Authorization = 'Bearer ' + token; } $.ajax({ type: 'GET', url: 'CONTROLLER/ACTION', headers: headers }).done(function (data) { self.result(data); }).fail(showError); 

ACTUALIZACIÓN Por cierto, si desea agregar los valores en su archivo web.config para recuperarlos como lo hice anteriormente; simplemente agréguelos en AppSettings:

        

… por supuesto, reemplazando los “valores” con los tuyos

No sé si resolvió esto, pero estaba teniendo un problema similar y decidí almacenar el token usando FormsAuthentication, que pude encriptar el token, y en cada solicitud la cookie fue devuelta y luego pude descifrarla para obtener el JWT y luego sacar los roles / reclamos de y luego usar esos roles para crear Identity Principal que me permita decorar mis métodos de controlador con [Authorize (Role = “blah, blah”)].

Aquí hay algunos ejemplos de código a continuación.

Una vez que recuperas el token web JSON de la API después de iniciar sesión, puedes usar algo como:

 var returnedToken = (TokenResponse)result.ReturnedObject; var ticket = new FormsAuthenticationTicket(1, model.Email, DateTime.Now, ConvertUnitToDateTime(returnedToken.expires_in), true, returnedToken.access_token); string encryptedTicket = FormsAuthentication.Encrypt(ticket); var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); cookie.HttpOnly = true; Response.Cookies.Add(cookie) 

Tengo algunas de mis propias clases y métodos creados allí, pero le dará la idea general de que almacena el token de acceso JWT así como la fecha de vencimiento en su cookie FormsAuthentication.

Luego, la cookie se pasa con cada solicitud y en su archivo Global.asax puede tener un método para autenticar la solicitud:

 protected void Application_AuthenticateRequest(Object sender, EventArgs e) { HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; if (authCookie != null) { //Extract the forms authentication cookie FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); JwtSecurityToken jwTok = TokenHelper.GetJWTokenFromCookie(authCookie); // Create the IIdentity instance IIdentity id = new FormsIdentity(authTicket); // Create the IPrinciple instance IPrincipal principal = new GenericPrincipal(id, TokenHelper.GetRolesFromToken(jwTok).ToArray()); // Set the context user Context.User = principal; } } 

De modo que ese método descifraría la cookie para obtener el token de acceso JWT que luego puede decodificar utilizando la biblioteca System.IdentityModel.Tokens.Jwt de Microsoft y luego tomar esos roles e ID y generar el principal y la identidad para el usuario que crea su usuario con los roles.

Entonces esos roles pueden validarse contra el atributo [Autorizar].