JSON Web令牌(JWT)实现.NET
该库支持生成和解码JSON Web令牌。
安装
最简单的安装方法是通过Nuget。请参阅此处。否则,您可以自己下载和编译。
用法
创建令牌
var payload = new Dictionary < string , object > ( ) { { \"claim1\" , 0 } , { \"claim2\" , \"claim2-value\" } } ; var secretKey = \"GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk\" ; string token = JWT . JsonWebToken . Encode ( payload , secretKey , JWT . JwtHashAlgorithm . HS256 ) ; Console . WriteLine ( token ) ;
输出将是:Eyj0exaioijkv1qilcjhbgcioijiuzi1nij9999.yjjbgfpbteiojasimnsywltmiiiiiiiiiiiiiiiiii6imnsywltmi12ywx1zsj9.8pwbi
验证和解码令牌
var token = \"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJjbGFpbTEiOjAsImNsYWltMiI6ImNsYWltMi12YWx1ZSJ9.8pwBI_HtXqI3UgQHQ_rDRnSQRxFL1SR8fbQoS-5kM5s\" ; var secretKey = \"GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk\" ; try { string jsonPayload = JWT . JsonWebToken . Decode ( token , secretKey ) ; Console . WriteLine ( jsonPayload ) ; } catch ( JWT . SignatureVerificationException ) { Console . WriteLine ( \"Invalid token!\" ) ; }
输出将是:
{\"claim1\":0,\"claim2\":\"claim2-value\"}
您还可以将JSON有效载荷直接划分到具有解释器的.NET对象:
var payload = JWT . JsonWebToken . DecodeToObject ( token , secretKey ) as IDictionary < string , object > ; Console . WriteLine ( payload [ \"claim2\" ] ) ;
将输出:
claim2-value
EXP索赔
如JWT RFC中所述,EXP“索赔确定不得接受JWT的到期时间或之后的到期时间。”如果存在EXP索赔,并且在当前时间之前,则令牌将失败验证。 EXP(到期)值必须指定为自1970 UTC以来的秒数。
var unixEpoch = new DateTime ( 1970 , 1 , 1 , 0 , 0 , 0 , DateTimeKind . Utc ) ; var now = Math . Round ( ( DateTime . UtcNow - unixEpoch ) . TotalSeconds ) ; var payload = new Dictionary < string , object > ( ) { { \"exp\" , now } } ; var secretKey = \"GQDstcKsx0NHjPOuXOYg5MbeJ1XT0uFiwDVvVBrk\" ; string token = JWT . JsonWebToken . Encode ( payload , secretKey , JWT . JwtHashAlgorithm . HS256 ) ; string jsonPayload = JWT . JsonWebToken . Decode ( token , secretKey ) ; // JWT.SignatureVerificationException!
配置JSON序列化
默认情况下,JSON序列化由System.Web.Script.Serialization.javaScriptSerializer完成。要配置不同的一个,首先实现了ijsonserializer界面。
public class CustomJsonSerializer : IJsonSerializer { public string Serialize ( object obj ) { // Implement using favorite JSON Serializer } public T Deserialize < T > ( string json ) { // Implement using favorite JSON Serializer } }
接下来,将此序列化器配置为jsonserialializer。
JsonWebToken . JsonSerializer = new CustomJsonSerializer ( ) ;
