.net core api接口JWT方式认证Token
程序员文章站
2022-06-21 17:42:31
一、项目>管理nuget包 安装二、.appsettings.json添加"jwt": { "secret": "~!@#$%^&*()_+qwertyuiopasldkh[o51...
一、项目>管理nuget包 安装
二、.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(); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 冬至吃汤圆
下一篇: 知乎8.0,内容社区的“温度”与“深度”
推荐阅读
-
Asp.Net Core基于JWT认证的数据接口网关实例代码
-
ASP.NET Core 2.2 : 二十六. 应用JWT进行用户认证及Token的刷新
-
在.NET Core中使用Jwt对API进行认证
-
ASP.NET Core 3.0 一个 jwt 的轻量角色/用户、单个API控制的授权认证库
-
详解ASP.NET Core Web Api之JWT刷新Token
-
【从零开始搭建自己的.NET Core Api框架】(四)实战!带你半个小时实现接口的JWT授权验证
-
ASP.NET Core 2.2 : 二十六. 应用JWT进行用户认证及Token的刷新
-
IdentityServer4实现.Net Core API接口权限认证(快速入门)
-
.net core api接口JWT方式认证Token
-
在.NET Core中使用Jwt对API进行认证