Para generar los tokens necesitamos una llave secreta, y los datos del Issuer (quien genera el token) y las urls de las cuales vamos a aceptar la conexión a nuestros servicios.
Vamos a agregar la configuración para generar los tokens en nuestro archivo appsettings.json, de esta forma si luego queremos cambiar los datos para generar los tokens solo debemos reiniciar el servicio. Si lo agregamos en nuestro código por ejemplo en nuestro archivo de constantes debemos de generar la dll y luego reemplazarla en el servidor. Si usas azure devops para generar los deploys automáticamente, puedes agregar constantes en tu código para registrar estos datos. r versión.
En nuestro archivo startup.cs en el método ConfigureServices indicamos que nuestros servicios requieren de seguridad (services.AddAuthentication), en nuestra variable Configuration tenemos acceso a los valores de nuestro archivo appsettings, entre [] indicamos cuál nodo deseamos y con : nos vamos al siguiente nivel de cada nodo, así si deseamos obtener el valor del valor key, sería Tokens:Key.
Con la opción TokenValidationParameters, indicamos cuales validaciones queremos realizar a nuestros tokens, en este caso validamos:
Que el Issuer y la audiencia sean los valores del archivo appsettings
Que la llave de cifrado sea la misma de nuestro archivo appsettings
La fecha de caducidad del token.
startup.cs
publicvoidConfigureServices(IServiceCollection services){ //Códigoservices.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(cfg => {cfg.Audience=Configuration["Tokens:Issuer"];cfg.Authority=Configuration["Tokens:Audience"];cfg.TokenValidationParameters=new TokenValidationParameters() { //Se va a validar el issuer (Quien genera el token) ValidIssuer =Configuration["Tokens:Issuer"], ValidateAudience =true, //Se va a validar la audiencia que puede usar el token ValidAudience =Configuration["Tokens:Audience"], //Se valida la llave de cifrado ValidateIssuerSigningKey =true, IssuerSigningKey =newSymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Tokens:Key"])); //Se validara el tiempo de vida del token ValidateLifetime =true });}
Indicamos a swagger que nuestros servicios requieren token
startup.cs
publicvoidConfigureServices(IServiceCollection services){ //Codigoservices.AddSwaggerGen(c => { //Código de swagger //Incluimos que vamos a utilizar tokensc.AddSecurityDefinition("Bearer",newOpenApiSecurityScheme { Description ="JWT Authorization (bearer)", Type =SecuritySchemeType.Http, Scheme ="bearer" });c.AddSecurityRequirement(newOpenApiSecurityRequirement{ {newOpenApiSecurityScheme{ Reference =newOpenApiReference{ Id ="Bearer", Type =ReferenceType.SecurityScheme } },newList<string>() } }); });
En el servicio de MVC indicaremos que todos nuestros servicios no se van a poder accesar si el usuario no ha iniciado sesión
startup.cs
publicvoidConfigureServices(IServiceCollection services){services.AddControllers(options => {options.EnableEndpointRouting=false; //Agregamos una politica para indicar que nuestros servicios //requieren que los usuarios hayan iniciado sesiónvar policy =newAuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build();options.Filters.Add(newAuthorizeFilter(policy)); })
En el método configure agregamos la autenticación y la autorización