Usuario
Autenticacion Jwt para api y pagina mvc

Pregunta
-
Hola,
Estoy tratando de relizar una autenticacion con json web token, todo va bien al proteger los action, sin embargo, cuando trato de proteger el controlador me devuelve un unauthorized porque no se como enviar enviar el token en una peticion con href o windows location. El sitio web lo estoy haciendo con mvc core 2.1
Este es el codigo que tengo en el startup
public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); services.AddAuthentication(x => { x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(x => { x.RequireHttpsMetadata = false; x.SaveToken = true; x.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Convert.FromBase64String(Configuration["Jwt:SigningSecret"])), ValidateIssuer = false, ValidateAudience = false }; }); }
public void Configure(IApplicationBuilder app, IHostingEnvironment env, WebBookingContext context) { if (env.IsDevelopment()) { app.UseBrowserLink(); app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseCors(x => x .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader()); app.UseAuthentication(); app.UseMvc(routes => { routes.MapRoute( name: "Login", template: "{controller=Login}/{action=Index}/{id?}"); using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope()) { context = serviceScope.ServiceProvider.GetRequiredService<WebBookingContext>(); context.Database.Migrate(); } }
Este es el codigo del login
var signingKey = Convert.FromBase64String(_configuration["Jwt:SigningSecret"]); var ExpiryDuration = Convert.ToInt32(_configuration["Jwt:ExpiryDuration"]); var tokenDescriptor = new SecurityTokenDescriptor { Issuer = null, Audience = null, IssuedAt = DateTime.UtcNow, NotBefore = DateTime.UtcNow, Expires = DateTime.UtcNow.AddDays(ExpiryDuration), Subject = new ClaimsIdentity(new[]{ new Claim("UserID", _usuarios.UserID), new Claim("Rol", _usuarios.Roles.Nombre), new Claim("Email", _usuarios.Email) }), SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(signingKey), SecurityAlgorithms.HmacSha256Signature) }; var jwtTokenHandler = new JwtSecurityTokenHandler(); var jwtToken = jwtTokenHandler.CreateJwtSecurityToken(tokenDescriptor); var token = jwtTokenHandler.WriteToken(jwtToken);
Ojala me puedan dar alguna sugerencia.
Gracias.
Roberto Meneses
Todas las respuestas
-
Hola
Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te hago la recomendación de ingresar al siguiente enlace en donde puedes encontrar una posible solución para tu problema.https://www.oscarblancarteblog.com/2017/06/08/autenticacion-con-json-web-tokens/
Gracias por usar los foros de MSDN.
Carlos Ruiz
____
Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.
Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft. -
-
Hola Sergio,
Este es el codigo,
$.ajax({ url: form.action, headers: { "Authorization": 'Bearer ' + localStorage.getItem('token') }, type: "POST", data: new FormData(form), processData: false, contentType: false, async: true, success: function (result) { if (result.success) { tableUsuarios = $('#dtUsuarios').DataTable(); tableUsuarios.ajax.reload(); } } });
Codigo del controlador,
public class UsuariosController : Controller
Codigo Accion dentro del controlador,
[Authorize(Policy = "SuperAdmin")] public async Task<IActionResult> CreateOrEdit(Usuarios usuarios)
Todo anda bien con el codigo de ariba, el problema viene cuando le coloco el Authorize al controlador o a las vistas, ya que no se como enviarles el token desde el cliente,
[Authorize(Policy = "SuperAdmin")] public class UsuariosController : Controller [Authorize(Policy = "SuperAdmin")] public IActionResult Index()
Si lo hago desde postaman me autoriza correcto vista y controladores, pero en un llamada asi como le envio el token al servidor para que me muestre o no la vista dependiendo de los permisos?
<li class="active">@Html.ActionLink("Usuarios", "Index", "Usuarios", new { area = "Admin" })</li>
Roberto Meneses