• ASP.NET Core中基于令牌(JWT)的身份验证及JQuery调用方式


    这篇文章是关于ASP.NET Core中基于令牌的身份验证。基于令牌的身份验证系统背后的一般概念很简单。允许用户输入用户名和密码,以获取允许他们获取特定资源的令牌 - 而无需使用他们的用户名和密码。一旦获得其令牌,用户就可以向远程站点提供令牌 - 其提供对特定资源的访问一段时间。

    要使用令牌或JWT身份验证,首先需要配置JWT身份验证中间件。

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(jwtBearerOptions =>
        {
            jwtBearerOptions.TokenValidationParameters = new TokenValidationParameters()
            {
                ValidateActor = true,
                ValidateAudience = true,
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                ValidIssuer = Configuration["Issuer"],
                ValidAudience = Configuration["Audience"],
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["SigningKey"])),
                ValidateLifetime = true,
                ValidateIssuer = true,
                ValidateAudience = true,
            };
        });
     
        services.AddMvc();
    }

    您已完成配置,现在需要将身份验证中间件添加到应用程序构建器。你可以在Configure方法中做到这一点。

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
     
        app.UseAuthentication();
        app.UseMvc();
    }

    现在您需要一个控制器操作方法,它可以帮助用户生成令牌。

    [AllowAnonymous]
    [HttpPost]
    [Route("token")]
    public IActionResult Post([FromBody]LoginViewModel loginViewModel)
    {
        if (ModelState.IsValid)
        {
            //This method returns user id from username and password.
            var userId = GetUserIdFromCredentials(loginViewModel); 
            if (userId == -1)
            {
                return Unauthorized();
            }
     
            var claims = new[]
            {
                new Claim(JwtRegisteredClaimNames.Sub, loginViewModel.Username),
                new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
            };
     
            var token = new JwtSecurityToken
            (
                issuer: _configuration["Issuer"],
                audience: _configuration["Audience"],
                claims: claims,
                expires: DateTime.UtcNow.AddDays(60),
                notBefore: DateTime.UtcNow,
                signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["SigningKey"])),
                        SecurityAlgorithms.HmacSha256)
            );
     
            return Ok(new { token = new JwtSecurityTokenHandler().WriteToken(token) });
        }
     
        return BadRequest();
    }

    现在,您可以使用[Authorize]属性保护资源。

    [Authorize]
    [Route("api/[controller]")] public class ValuesController : Controller
    {
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
    }

    这是没有标题的POSTMAN get请求的屏幕截图。

     现在,您可以使用令牌端点使用用户名和密码生成令牌,这将生成令牌。

    接下来,您可以使用Authorization标头请求值控制器,其中包含从令牌端点接收的令牌,该令牌将返回值。

    如果你正在使用JQuery,你可以像这样使用JQuery Ajax方法。

    $.ajax({
        type: 'GET',
        url: '/api/values',
        headers: {
            "Authorization": "Bearer YOUR-TOKEN"
        }
    }).done(function (data) {
        console.log(data);
    });

     本问翻译自https://dotnetthoughts.net/token-based-authentication-in-aspnet-core/

    GitHub地址:https://github.com/anuraj/AspNetCoreSamples/tree/master/WebApiAuthDemo

    来自:https://blog.csdn.net/haitaoDoit/article/details/86607346?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-1.essearch_pc_relevant&spm=1001.2101.3001.4242.2

  • 相关阅读:
    windows下 删除指定文件夹里面一周前的所有文件和文件夹的bat
    freeswitch 把SIP注册信息数据库从SQLITE 改为MYSQL的方法
    memcached+Mysql(主从)
    Linux下的MySQL主主复制
    RabbitMQ php 使用
    如果你写PHP, 请多注意自己是否有良好的习惯
    MySQL主从配置的一些总结
    Mongodb与mysql语法比较
    Yii框架tips
    Windows下Python添加MySQLdb扩展模块
  • 原文地址:https://www.cnblogs.com/djd66/p/15660572.html
Copyright © 2020-2023  润新知