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权限配置入门