Feng - 2018年5月
type: channel
link: http://fengyitong.name/index.php/2018/05/
description: 半山腰的风采
items: C# webapi实现jwt口令认证入门
items: Map地图上覆盖物实现事件透传

C# webapi实现jwt口令认证入门
type: item
date: 2018-05-27T22:38:51+08:00
description: jwt因为他的简单易用,并且有一定的加密性,在restful中会广泛使用.这里记录一下简单的jwt登录验证实现.通过nuget管理工具安装jwt管理,可以根据自己项目依赖性选择 4.0 3.0或者2.x,本人用的是3.0.0凡是口令都是两部分,一部分是加密后发送到客户端,一部分是获取客户端加密后的字符串,解密后得到真实值.using JWT; using JWT.Algorithms; using JWT.Serializers; using Newtonsoft.Json; .... // 对象实体类加密 public static string CreateJWTToken<T>(this T payload, string secret) { IJwtAlgorithm algorithm = new HMACSHA256Algorithm(); IJsonSerializer serializer = new JsonNetSerializer(); IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder(); IJwtEncoder encoder = new JwtEncoder(algorithm, serializer, urlEncoder); string token = encoder.Encode(payload, secret); return token; }上面是最简单的加密方式,可以根据自己的需要换不同的加密方式. public static string GetJsonByToken(string token, string secret) { try { IJsonSerializer serializer = new JsonNetSerializer(); IDateTimeProvider provider = new UtcDateTimeProvider(); IJwtValidator validator = new JwtValidator(serializer, provider); IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder(); IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder); string json = decoder.Decode(token, secret, true); return json; } catch (TokenExpiredException) { //口令过期 //Console.WriteLine("expired"); return "expired"; } catch (SignatureVerificationException) { //无效口令. //Console.WriteLine("Err"); return "err"; } catch (Exception) { throw; } } 上面是简单的把口令解密成json字符串的方法.不过实际上我们希望得到的一般都是对应的实体类,可以再做一层封装: public static T GetObjectByToken<T>(string token, string secret) { var json = JWTHelper.GetJsonByToken(token, secret); if (json == "expired" || json == "err") return default(T); try { T obj = default(T); var data = JsonConvert.DeserializeAnonymousType(json, obj); return data; } catch (Exception) { return default(T); } }JsonConvert.DeserializeAnonymousType 这个方法很好用,一般是用来有些json对象只用到一次的时候,单单创建一个匿名对象,而不是重新建一个实体类.jwt口令加密及解密,就写这么多了,具体如何用到webapi中,可以参考之前写的一篇文章:AuthorizeAttribute权限配置入门

Map地图上覆盖物实现事件透传
type: item
date: 2018-05-05T16:48:23+08:00
description: 做地图页面的时候,很多情况下我们会在页面上加各种悬浮在地图上的dom元素,又不希望能影响地图的点击事件.只要给dom元素css样式: pointer-events:none 当dom内部某些子元素按钮需要有点击事件时,只要给子元素css样式重新设置:pointer-events: auto即可小技巧在做地图时非常有用,自己记录一下~