欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

.net core api接口JWT方式认证Token

程序员文章站 2022-06-21 17:42:31
一、项目>管理nuget包 安装二、.appsettings.json添加"jwt": { "secret": "~!@#$%^&*()_+qwertyuiopasldkh[o51...

一、项目>管理nuget包 安装

.net core api接口JWT方式认证Token

二、.appsettings.json添加

"jwt": {
    "secret": "~!@#$%^&*()_+qwertyuiopasldkh[o51485421ajshk^%*)kasd", // 密钥
    "issuer": "kfjdhf", // 颁发者
    "audience": "kfjdhf", // 接收者
    //"expired": 30 // 过期时间(30min)
  }

三、configureservices注入jwt

 #region 注册jwt
 
            //获取配置文件
            var jwtconfig = configuration.getsection("jwt");
            //生成密钥
            var symmetrickeyasbase64 = jwtconfig.getvalue<string>("secret");
            var keybytearray = encoding.ascii.getbytes(symmetrickeyasbase64);
            var signingkey = new symmetricsecuritykey(keybytearray);
 
            //认证参数
            services.addauthentication("bearer")
                .addjwtbearer(o =>
                {
                    o.tokenvalidationparameters = new tokenvalidationparameters
                    {
                        validateissuersigningkey = true,//是否验证签名,不验证的画可以篡改数据,不安全
                        issuersigningkey = signingkey,//解密的密钥
                        validateissuer = true,//是否验证发行人,就是验证载荷中的iss是否对应validissuer参数
                        validissuer = jwtconfig.getvalue<string>("iss"),//发行人
                        validateaudience = true,//是否验证订阅人,就是验证载荷中的aud是否对应validaudience参数
                        validaudience = jwtconfig.getvalue<string>("aud"),//订阅人
                        validatelifetime = true,//是否验证过期时间,过期了就拒绝访问
                        clockskew = timespan.zero,//这个是缓冲过期时间,也就是说,即使我们配置了过期时间,这里也要考虑进去,过期时间+缓冲,默认好像是7分钟,你可以直接设置为0
                        requireexpirationtime = true,
                    };
                });
            #endregion

(2).configure启用

app.useauthentication();//jwt

四、创建jwt帮助类

using microsoft.extensions.configuration;
using microsoft.identitymodel.tokens;
using system;
using system.collections.generic;
using system.identitymodel.tokens.jwt;
using system.linq;
using system.security.claims;
using system.text;
 
namespace systemapi.jwt
{
        public class jwthelper
        {
            public jwthelper(iconfiguration configuration)
            {
                configuration = configuration;
            }
            /// <summary>
            /// 配置属性
            /// </summary>
            public iconfiguration configuration { get; }
            /// <summary>
            /// 生成token
            /// </summary>
            /// <returns></returns>
            public string generatetoken(list<claim> claims)
            {
                var jwtconfig = configuration.getsection("jwt");
                //秘钥,就是标头,这里用hmacsha256算法,需要256bit的密钥
                var securitykey = new signingcredentials(new symmetricsecuritykey(encoding.ascii.getbytes(jwtconfig.getvalue<string>("secret"))), securityalgorithms.hmacsha256);
                //claim,jwtregisteredclaimnames中预定义了好多种默认的参数名,也可以像下面的guid一样自己定义键名.
                //claimtypes也预定义了好多类型如role、email、name。role用于赋予权限,不同的角色可以访问不同的接口
                //相当于有效载荷
                list<claim> baseclaims = new list<claim>{
                new claim(jwtregisteredclaimnames.iss,jwtconfig.getvalue<string>("issuer")),
                new claim(jwtregisteredclaimnames.aud,jwtconfig.getvalue<string>("audience")),
                new claim("guid",guid.newguid().tostring("d")),
                new claim(claimtypes.role,"admin"),
             };
                claims = claims.union<claim>(baseclaims).tolist<claim>();//合并claim,删除重复项目
 
                securitytoken securitytoken = new jwtsecuritytoken(
                    signingcredentials: securitykey,
                    expires: datetime.now.adddays(1),//过期时间
                    claims: claims
                );
                //生成jwt令牌
                return new jwtsecuritytokenhandler().writetoken(securitytoken);
            }
        }
    }

五、测试登录成功把账户信息存进token

 /// 登录
        /// </summary>
        /// <returns>登录</returns>
        [httpget]
 
        public returnjson login(string name, string pwd)
        {
            
            user data = bll.login(name, pwd);
            if (data!=null)
            {
                if (data.name == name && data.password == pwd)
                {
                    list<claim> claims = new list<claim>() {
                    new claim(claimtypes.nameidentifier, data.name),
                    new claim(claimtypes.role,data.adminid.tostring()),
                    new claim("adminrole",data.adminid.tostring())
                    };
                    string token=jwthelper.generatetoken(claims);
 
                     return new returnjson<string>().success(token);                  
                    
                };
              
            }
            return new returnjson().fail();
        }

.net core api接口JWT方式认证Token

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。