visual studio net mvc example ejemplo crear asp c# asp.net-mvc-4 authentication authorization asp.net-identity

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



web api ejemplo (2)

Planeaba usar ASP.NET Identity 2.0 en una aplicación ASP.NET MVC para autenticación y autorización.

Refiriéndose al siguiente enlace

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

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

Ahora, leí en algunos artículos que necesitamos pasar el token de portador en los encabezados de 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 usando JWT siempre que el usuario intente acceder al método con el atributo autorizar. Como usaré llamadas AJAX en muchas páginas para acceder al método presente en el controlador MVC, no creo que sea bueno pasar un token en cada solicitud AJAX. Necesito ayuda para lograr la autenticación y la autorización de manera eficiente usando ASP.NET Identity en una aplicación MVC.

Actualmente, no sé cómo usar este token JWT para autenticación y autorización en una aplicación MVC.


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

Aquí hay un código de muestra a continuación.

Una vez que recuperes 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 de autenticación de formularios.

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

Entonces, ese método descifraría la cookie para obtener el token de acceso JWT que luego puede decodificar usando 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 se pueden validar contra el atributo [Autorizar].


Para que MVC entienda algo sobre su JWT, básicamente tiene que decirlo :-). Primero, instale el paquete Jwt de nuget:

Install-Package Microsoft.Owin.Security.Jwt

Luego abra su archivo Startup.cs y agregue una nueva función que le dirá a MVC cómo consumir JWT. En lo básico, su Startup se verá más o menos así:

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["Issuer"]; var audienceId = ConfigurationManager.AppSettings["AudienceId"]; var audienceSecret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["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á que estoy colocando el emisor, audienciaId y audienciaSecreto 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:

Update-package System.IdentityModel.Tokens.Jwt

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

Jugar a la pelota, por supuesto, significa enviar su solicitud desde su javascript a su 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 bajo AppSettings:

<configuration> <appSettings> <add key="Issuer" value="YOUR_ISSUER" /> <add key="AudienceId" value="YOUR_AUDIENCEID" /> <add key="AudienceSecret" value="YOUR_AUDIENCESECRET" /> </appSettings> </configuration>

... por supuesto, reemplazando los "valores" por los suyos