.netcore2.1 使用IdentityServer4 生成Token验证
程序员文章站
2022-07-02 17:09:47
每个新技术权限验证都有一套机制,之前项目WebApi接口权限验证用的是Owin做为权限验证,而.netcore权限限制使用的是IdentityServer4,采用JWT的方法验证token. 首先使用Guget包管理添加IdentityServer4包的引用,如图 生成token方法 创建JwtTo ......
每个新技术权限验证都有一套机制,之前项目webapi接口权限验证用的是owin做为权限验证,而.netcore权限限制使用的是identityserver4,采用jwt的方法验证token.
- 首先使用guget包管理添加identityserver4包的引用,如图
- 生成token方法
/// <summary> /// 生成token /// </summary> /// <param name="userid"></param> /// <param name="key">jwtkey</param> /// <returns></returns> public static string generatetoken(string userid, string key) { var tokenhandler = new jwtsecuritytokenhandler(); var keybytes = system.text.encoding.default.getbytes(key); var authtime = datetime.utcnow; var expireaat = authtime.addhours(24);//token过期时间 var timestamp = timestamp.generatetimestamp(authtime);//生成日间戳 var sign = myunity.getmd5upper32((userid + "&" + timestamp + "&" + key).toupper()); var tokendescriptor = new securitytokendescriptor() { subject = new claimsidentity(new claim[] { new claim(jwtclaimtypes.audience,"api"), new claim(jwtclaimtypes.issuer,"hengfeng"), new claim(jwtclaimtypes.id,userid), new claim("timestamp",timestamp), new claim("sign",sign), }), expires = expireaat, signingcredentials = new signingcredentials(new symmetricsecuritykey(keybytes), securityalgorithms.hmacsha256signature) }; var token = tokenhandler.createtoken(tokendescriptor); var tokenstring = tokenhandler.writetoken(token); return tokenstring; }
- 创建jwttokenfilter过滤器
public class jwttokenfilter : actionfilterattribute { private readonly iconfiguration _config; public jwttokenfilter(iconfiguration configuration) { _config = configuration; } public override void onactionexecuting(actionexecutingcontext context) { try { var token = context.httpcontext.request.headers["token"]; var tokenhandler = new jwtsecuritytokenhandler(); var jwtsecuritytoken = tokenhandler.readjwttoken(token); var claims = jwtsecuritytoken.claims; var userid = claims.firstordefault(m => m.type == "id").value; var sign = claims.firstordefault(m => m.type == "sign").value; var expireaat = claims.firstordefault(m => m.type == "exp").value; var key = _config["jwt_key"]; var timestamp = claims.firstordefault(m => m.type == "timestamp").value; var sign_new = myunity.getmd5upper32((userid + "&" + timestamp + "&" + key).toupper()); if (!sign_new.equals(sign, stringcomparison.invariantcultureignorecase)) { context.result = new jsonresult( "账号未登录"); } else { var expirestime = timestamp.convertintdatetime(expireaat); if ((datetime.now - expirestime).minutes > 0) { context.result = new jsonresult("账号token失效"); } } } catch (exception ex) { context.result = new jsonresult(ex.tostring()); } } }
- 在使用控制器中添加 [servicefilter(typeof(jwttokenfilter))] 特性
// get: api/default/5 [httpget("{id}", name = "get")] [servicefilter(typeof(jwttokenfilter))] public string get(int id) { return "value"; }
- 如果该控制器不需要验证token,加上允许匿名访问特性即可
[httppost] [allowanonymous] public void post([frombody] string value) { }
最后:注意登录成功后,需要把生成的token返回给前端,前端再一次请求系统其它需要验证token的接口中,在head中加上token值。
用到的加密算法
/// <summary> /// md5 16位长度 /// </summary> /// <param name="svalue"></param> /// <returns></returns> public static string getmd5upper16(string svalue) { md5cryptoserviceprovider md5 = new md5cryptoserviceprovider(); string s = bitconverter.tostring(md5.computehash(utf8encoding.default.getbytes(svalue)), 4, 8); s = s.replace("-", "").toupper(); return s; } /// <summary> /// md5 32位长度 /// </summary> /// <param name="svalue"></param> /// <returns></returns> public static string getmd5upper32(string svalue) { md5cryptoserviceprovider md5 = new md5cryptoserviceprovider(); string s = bitconverter.tostring(md5.computehash(utf8encoding.default.getbytes(svalue))); s = s.replace("-", "").toupper(); return s; }
推荐阅读
-
基于ASP.NET Core数据保护生成验证token示例
-
使用JS随机生成数字混合字母的验证码
-
从零开始搭建前后端分离的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的项目框架之七使用JWT生成Token(个人见解)
-
Nodejs中使用captchapng模块生成图片验证码
-
PHP使用GIFEncoder类生成的GIF动态图片验证码
-
JavaScript使用Math.random()生成简单的验证码
-
ThinkPHP5&5.1实现验证码的生成、使用及点击刷新功能示例
-
SpringBoot使用Captcha生成验证码
-
Python使用PIL模块生成随机验证码
-
使用canvas及js简单生成验证码方法