2018年5月

C# webapi实现jwt口令认证入门

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地图上覆盖物实现事件透传

做地图页面的时候,很多情况下我们会在页面上加各种悬浮在地图上的dom元素,又不希望能影响地图的点击事件.
只要给dom元素css样式: pointer-events:none

当dom内部某些子元素按钮需要有点击事件时,只要给子元素css样式重新设置:pointer-events: auto即可

小技巧在做地图时非常有用,自己记录一下~