我一直在使用JWT库来解码Json Web Token,并希望切换到Microsoft的官方JWT实现System.IdentityModel.Tokens.Jwt.
文档非常稀疏,所以我很难弄清楚如何完成我在JWT库中所做的工作.使用JWT库,有一个Decode方法,它采用base64编码的JWT并将其转换为JSON,然后可以对其进行反序列化.我想使用System.IdentityModel.Tokens.Jwt做类似的事情,但经过大量的挖掘,无法弄清楚如何.
为了它的价值,我正在从cookie中读取JWT令牌,以便与Google的身份框架一起使用.
任何帮助,将不胜感激.
Mik*_*win 135
在包中有一个JwtSecurityTokenHandler派生自的类System.IdentityModel.Tokens.SecurityTokenHandler.在WIF中,这是用于反序列化和序列化安全令牌的核心类.
这个类有一个ReadToken(String)方法,将您的base64编码字符串JWT,并返回一个SecurityToken代表了JWT.
该SecurityTokenHandler也有ValidateToken(SecurityToken)这需要你的方法SecurityToken,并创建一个ReadOnlyCollection<ClaimsIdentity>.一般为JWT,这将包含单个ClaimsIdentity具有一组表示的原始JWT的属性权利要求中的对象.
JwtSecurityTokenHandler定义了一些额外的重载ValidateToken,特别是它有一个ClaimsPrincipal ValidateToken(JwtSecurityToken, TokenValidationParameters)过载.该TokenValidationParameters参数允许您指定令牌签名证书(作为列表X509SecurityTokens).它也有一个过载,将JWT作为一个string而不是一个SecurityToken.
该代码做,这是相当复杂的,但可以在Global.asax.cx代码(可以找到TokenValidationHandler开发商样品中类)被称为"ADAL -原生应用休息服务-身份验证通过浏览器对话框ACS",位于
http://code.msdn.microsoft.com/AAL-Native-App-to-REST-de57f2cc
可替代地,JwtSecurityToken类具有额外的方法不属于在基SecurityToken类,如Claims那获取所含的权利要求书不经由去属性ClaimsIdentity集合.它还有一个Payload属性,该属性返回一个JwtPayload对象,使您可以获得令牌的原始JSON.这取决于您的场景哪种方法最合适.
该SecurityTokenHandler课程的一般(即非JWT特定)文件是
http://msdn.microsoft.com/en-us/library/system.identitymodel.tokens.securitytokenhandler.aspx
根据您的应用程序,您可以配置JWT处理程序到WIF管道完全像任何其他处理程序.
其中有3个样品在不同类型的应用中使用
可能会满足您的需求,或至少适应它们.
Reg*_*for 25
我只是想知道为什么要使用一些库进行JWT令牌解码和验证.
可以使用以下伪代码创建编码的JWT令牌
var headers = base64URLencode(myHeaders);
var claims = base64URLencode(myClaims);
var payload = header + "." + claims;
var signature = base64URLencode(HMACSHA256(payload, secret));
var encodedJWT = payload + "." + signature;
Run Code Online (Sandbox Code Playgroud)
没有任何特定的库很容易做到.使用以下代码:
using System;
using System.Text;
using System.Security.Cryptography;
public class Program
{
// More info: https://stormpath.com/blog/jwt-the-right-way/
public static void Main()
{
var header = "{\"typ\":\"JWT\",\"alg\":\"HS256\"}";
var claims = "{\"sub\":\"1047986\",\"email\":\"jon.doe@eexample.com\",\"given_name\":\"John\",\"family_name\":\"Doe\",\"primarysid\":\"b521a2af99bfdc65e04010ac1d046ff5\",\"iss\":\"http://example.com\",\"aud\":\"myapp\",\"exp\":1460555281,\"nbf\":1457963281}";
var b64header = Convert.ToBase64String(Encoding.UTF8.GetBytes(header))
.Replace('+', '-')
.Replace('/', '_')
.Replace("=", "");
var b64claims = Convert.ToBase64String(Encoding.UTF8.GetBytes(claims))
.Replace('+', '-')
.Replace('/', '_')
.Replace("=", "");
var payload = b64header + "." + b64claims;
Console.WriteLine("JWT without sig: " + payload);
byte[] key = Convert.FromBase64String("mPorwQB8kMDNQeeYO35KOrMMFn6rFVmbIohBphJPnp4=");
byte[] message = Encoding.UTF8.GetBytes(payload);
string sig = Convert.ToBase64String(HashHMAC(key, message))
.Replace('+', '-')
.Replace('/', '_')
.Replace("=", "");
Console.WriteLine("JWT with signature: " + payload + "." + sig);
}
private static byte[] HashHMAC(byte[] key, byte[] message)
{
var hash = new HMACSHA256(key);
return hash.ComputeHash(message);
}
}
Run Code Online (Sandbox Code Playgroud)
令牌解码是上面代码的反转版本.要验证签名,您需要相同并将签名部分与计算的签名进行比较.
更新:对于那些如何努力如何做base64 urlsafe编码/解码请看另一个SO问题,以及维基和RFC
| 归档时间: |
|
| 查看次数: |
88809 次 |
| 最近记录: |