none
Autenticacion Jwt para api y pagina mvc RRS feed

  • 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

    lunes, 13 de mayo de 2019 23:24

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/

    https://support.zendesk.com/hc/es/articles/203663816-Activaci%C3%B3n-del-inicio-de-sesi%C3%B3n-%C3%BAnico-con-JWT-Token-Web-JSON-

    https://jwt.io/

    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.

    martes, 21 de mayo de 2019 18:04
  • Hola, puedes mostrar el código de cómo haces las llamadas a los controladores? 


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    miércoles, 22 de mayo de 2019 15:22
    Moderador
  • 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

    miércoles, 22 de mayo de 2019 17:34