• (三).NET Core WebAPI集成JWT,实现身份验证


    前两篇文章给大家介绍了在.NET Core中如何使用Swagger的文章,那今天给大家分享一下JWT

    在做接口开发的同学可能都有感受,我的接口如何保护的问题,如果没有身份验证,那不是接口完全暴露在外面,任意使人调用,这显然不是我们想要的一种结果。当然做身份验证的方式有多种,今天给大家讲一种比较流行了,标准的身份验证JWT

    什么是JWT?

    随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,然后通过token去取redis中的缓存的用户信息,随着之后jwt的出现,校验方式更加简单便捷化,无需通过redis缓存,而是直接根据token取出保存的用户信息,以及对token可用性校验,单点登录更为简单。

    JWT的结构体是什么样的?

    JWT由三部分组成,分别是头信息、有效载荷、签名,中间以(.)分隔

    (1)header(头信息)

    由两部分组成,令牌类型(即:JWT)、散列算法(HMAC、RSASSA、RSASSA-PSS等)

    (2)Payload(有效载荷)

    JWT的第二部分是payload,其中包含claims。claims是关于实体(常用的是用户信息)和其他数据的声明,claims有三种类型: registered, public, and private claims。

    Registered claims: 这些是一组预定义的claims,非强制性的,但是推荐使用, iss(发行人), exp(到期时间), sub(主题), aud(观众)等;

    Public claims: 自定义claims,注意不要和JWT注册表中属性冲突

    Private claims: 这些是自定义的claims,用于在同意使用这些claims的各方之间共享信息,它们既不是Registered claims,也不是Public claims。

    (3)Signature

    要创建签名部分,必须采用编码的Header,编码的Payload,秘钥,Header中指定的算法,并对其进行签名。

    JWT使用流程:

    JWT在.NET Core项目中的具体用法:

    (1)在ConfigureServices方法中添加JWT相关代码:

    #region 添加jwt验证:
        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options => {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,//是否验证Issuer
                        ValidateAudience = true,//是否验证Audience
                        ValidateLifetime = true,//是否验证失效时间
                        ValidateIssuerSigningKey = true,//是否验证SecurityKey
                        ValidAudience = Configuration["audience"],//Audience
                        ValidIssuer = Configuration["issuer"],//Issuer,这两项和前面签发jwt的设置一致
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["SecurityKey"]))//拿到SecurityKey
                    };
        });
    #endregion

    (2)在Configure方法中添加JWT代码:

    #region jwt
        app.UseAuthentication();//注意添加这一句,启用验证
    #endregion

    (3)创建一个JWT服务类:

    public class JWTService
    {
        private readonly IConfiguration _configuration;
    
        public JWTService(IConfiguration configuration)
        {
            _configuration = configuration;
        }
    
        public string GetToken(string UserName)
        {
            var claims = new[]
            {
                   new Claim(ClaimTypes.Name, UserName)
            };
    
            //sign the token using a secret key.This secret will be shared between your API and anything that needs to check that the token is legit.
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["SecurityKey"]));
            var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            //.NET Core’s JwtSecurityToken class takes on the heavy lifting and actually creates the token.
            /**
             * Claims (Payload)
                Claims 部分包含了一些跟这个 token 有关的重要信息。 JWT 标准规定了一些字段,下面节选一些字段:
    
                iss: The issuer of the token,token 是给谁的
                sub: The subject of the token,token 主题
                exp: Expiration Time。 token 过期时间,Unix 时间戳格式
                iat: Issued At。 token 创建时间, Unix 时间戳格式
                jti: JWT ID。针对当前 token 的唯一标识
                除了规定的字段外,可以包含其他任何 JSON 兼容的字段。
             * */
            var token = new JwtSecurityToken(
                issuer: _configuration["issuer"],
                audience: _configuration["audience"],
                claims: claims,
                expires: DateTime.Now.AddHours(24),
                signingCredentials: creds);
            string returnToken = new JwtSecurityTokenHandler().WriteToken(token);
            return returnToken;
        }
    }

    (4)在接口类或方法上标记身份验证:

    到此为止,JWT的基本用法就结束,非常简单和方便,接下来我们用postman测试一下JWT是否生效:

    (1)当我们在不登录的情况下,访问接口看看是什么现象:

    我们发现接口返回提示:401 Unauthorized

    (2)我们先调用登录接口,先计算得到token,然后再来请求试试:

    登录成功后,接口返回了token值

    (3)将token复制粘贴到下方,请求业务接口,成功调用:

  • 相关阅读:
    编译安装LAMP之php-5.4.13、xcache-2.0及使用ab命令实现压力测试
    编译安装LAMP之MySQL-5.5.28(通用二进制格式)
    编译安装LAMP之httpd-2.4.4
    建立LAMP平台
    MySQL初步,数据类型及SQL语句
    数据库及MySQL
    PHP相关概念及配置
    CSS:页面美化和布局控制
    HTML标签:表单标签
    web概念简述,HTML学习笔记
  • 原文地址:https://www.cnblogs.com/NBIDataVis/p/11778203.html
Copyright © 2020-2023  润新知