JWT.net 操作实践方法
1.JWT定义
JWT(JsonWebToken)是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT作为一个开放的标准(RFC7519),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信息。因为数字签名的存在,这些信息是可信的,JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。
2.JWT的组成部分
(1)JWT一般由三段构成,用.号分隔开,第一段是header,第二段是payload,第三段是signature,
例如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
3.Jwt.Net使用
首先,需要先引入Jwt.Net,可通过nuget的方式添加:Install-PackageJWT-Version2.4.2(自己选择合适的版本)
(1)创建token,此处,我们只需要自定义payload和secrect密钥即可,可生成三段格式的字符串
varpayload=newDictionary{ {"claim1",0}, {"claim2","claim2-value"} }; varsecret="GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk"; IJwtAlgorithmalgorithm=newHMACSHA256Algorithm(); IJsonSerializerserializer=newJsonNetSerializer(); IBase64UrlEncoderurlEncoder=newJwtBase64UrlEncoder(); IJwtEncoderencoder=newJwtEncoder(algorithm,serializer,urlEncoder); vartoken=encoder.Encode(payload,secret); Console.WriteLine(token);
(2)token解密,可看到输出为{"claim1":0,"claim2":"claim2-value"},可以用json["claim1"],json["claim2"]的方式获取各个值,此处json为IDictionary
vartoken="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjbGFpbTEiOjAsImNsYWltMiI6ImNsYWltMi12YWx1ZSJ9.8pwBI_HtXqI3UgQHQ_rDRnSQRxFL1SR8fbQoS-5kM5s"; varsecret="GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk"; try { IJsonSerializerserializer=newJsonNetSerializer(); IDateTimeProviderprovider=newUtcDateTimeProvider(); IJwtValidatorvalidator=newJwtValidator(serializer,provider); IBase64UrlEncoderurlEncoder=newJwtBase64UrlEncoder(); IJwtDecoderdecoder=newJwtDecoder(serializer,validator,urlEncoder); varjson=decoder.Decode(token,secret,verify:true); Console.WriteLine(json); } catch(TokenExpiredException) { Console.WriteLine("Tokenhasexpired"); } catch(SignatureVerificationException) { Console.WriteLine("Tokenhasinvalidsignature"); }
(3)添加过期时间,过期时间即这个时间之后JWT不接受处理,时间的有效值为某一时刻和1970/1/100:00:00相差的秒数
下面的例子是当前时间到1970/1/100:00:00的秒数,即过期时间为当前时间。如果设置为当前时间+10秒,可添加secondsSinceEpoch=secondsSinceEpoch+10
IDateTimeProviderprovider=newUtcDateTimeProvider(); varnow=provider.GetNow(); varunixEpoch=newDateTime(1970,1,1,0,0,0,DateTimeKind.Utc);//oruseJwtValidator.UnixEpoch varsecondsSinceEpoch=Math.Round((now-unixEpoch).TotalSeconds); varpayload=newDictionary{ {"exp",secondsSinceEpoch} }; varsecret="GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk"; vartoken=encoder.Encode(payload,secret); varjson=decoder.Decode(token,secret);//TokenExpiredException
(4)也可自定义json解析器,只要继承IJsonSerializer接口
publicclassCustomJsonSerializer:IJsonSerializer { publicstringSerialize(objectobj) { //ImplementusingfavoriteJSONSerializer } publicTDeserialize(stringjson) { //ImplementusingfavoriteJSONSerializer } }
使用该解析器
IJwtAlgorithmalgorithm=newHMACSHA256Algorithm(); IJsonSerializerserializer=newCustomJsonSerializer(); IBase64UrlEncoderurlEncoder=newJwtBase64UrlEncoder(); IJwtEncoderencoder=newJwtEncoder(algorithm,serializer,urlEncoder);
以上这篇JWT.net操作实践方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。