c# - 如何加密 JWT 安全 token ?

标签 c# security wif jwt

我需要通过签名和加密来保护我的网络 token 。我写了下一行代码:

var tokenHandler = new JwtSecurityTokenHandler();
var tokenDescriptor = new SecurityTokenDescriptor
{
      Subject = new ClaimsIdentity(new[]
         {
             new Claim(ClaimTypes.Name, owner.Name),
             new Claim(ClaimTypes.Role, owner.RoleClaimType),
             new Claim("custom claim type", "custom content")
         }),
      TokenIssuerName = "self",
      AppliesToAddress = "http://www.example.com",
      Lifetime = new Lifetime(now, now.AddSeconds(60 * 3)),
      EncryptingCredentials = new X509EncryptingCredentials(new X509Certificate2(cert)),
      SigningCredentials = new X509SigningCredentials(cert1)
};
var token = (JwtSecurityToken)tokenHandler.CreateToken(tokenDescriptor);            
var tokenString = tokenHandler.WriteToken(token);

因此,我使用了一些证书,这些证书是通过 makecert.exe 生成的。然后我用另一个 JwtSecurityTokenHandler 读取 token 字符串:

var tokenHandlerDecr = new JwtSecurityTokenHandler();
var tok = tokenHandlerDecr.ReadToken(tokenString);

并且 token 内容未加密(我可以在调试器下的 tok 变量中看到 json)。我究竟做错了什么?如何加密token数据?

最佳答案

我知道这是一篇旧帖子,但如果有人仍在寻找答案,我会添加我的答案。

此问题已在 Microsoft.IdentityModel.Tokens version 5.1.3 中解决. CreateJwtSecurityToken 函数中有一个重载方法,它接受加密凭据来加密 token 。

如果接收方未验证签名并尝试按原样读取 JWT,则声明为空。以下是代码片段:

using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;

const string sec = "ProEMLh5e_qnzdNUQrqdHPgp";
const string sec1 = "ProEMLh5e_qnzdNU";
var securityKey = new SymmetricSecurityKey(Encoding.Default.GetBytes(sec));
var securityKey1 = new SymmetricSecurityKey(Encoding.Default.GetBytes(sec1)); 

var signingCredentials = new SigningCredentials(
    securityKey,
    SecurityAlgorithms.HmacSha512);

List<Claim> claims = new List<Claim>()
{
    new Claim("sub", "test"),
};

var ep = new EncryptingCredentials(
    securityKey1,
    SecurityAlgorithms.Aes128KW,
    SecurityAlgorithms.Aes128CbcHmacSha256);

var handler = new JwtSecurityTokenHandler();

var jwtSecurityToken = handler.CreateJwtSecurityToken(
    "issuer",
    "Audience",
    new ClaimsIdentity(claims),
    DateTime.Now,
    DateTime.Now.AddHours(1),
    DateTime.Now,
    signingCredentials,
    ep);


string tokenString = handler.WriteToken(jwtSecurityToken);

// Id someone tries to view the JWT without validating/decrypting the token,
// then no claims are retrieved and the token is safe guarded.
var jwt = new JwtSecurityToken(tokenString);

下面是验证/解密 token 的代码:

using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;

const string sec = "ProEMLh5e_qnzdNUQrqdHPgp";
const string sec1 = "ProEMLh5e_qnzdNU";
var securityKey = new SymmetricSecurityKey(Encoding.Default.GetBytes(sec));
var securityKey1 = new SymmetricSecurityKey(Encoding.Default.GetBytes(sec1));

// This is the input JWT which we want to validate.
string tokenString = string.Empty;

// If we retrieve the token without decrypting the claims, we won't get any claims
// DO not use this jwt variable
var jwt = new JwtSecurityToken(tokenString);

// Verification
var tokenValidationParameters = new TokenValidationParameters()
{
    ValidAudiences = new string[]
    {
        "536481524875-glk7nibpj1q9c4184d4n3gittrt8q3mn.apps.googleusercontent.com"
    },
    ValidIssuers = new string[]
    {
        "https://accounts.google.com"
    },
    IssuerSigningKey = securityKey,
    // This is the decryption key
    TokenDecryptionKey = securityKey1
};

SecurityToken validatedToken;
var handler = new JwtSecurityTokenHandler();

handler.ValidateToken(tokenString, tokenValidationParameters, out validatedToken);

关于c# - 如何加密 JWT 安全 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18223868/

相关文章:

c# - 如何在 C# asp.net 表单中显示/显示消息框?

c# - Visual Studio 的 'watch' 错误地将 Vector<float> 中的一半数字显示为零

c# - 如何在执行枚举时管理不断变化的列表?

c# - 以编程方式调用按钮的单击方法

.net - 使用 .NET/WIF/WCF 查询 WS-Trust 1.4 STS

c# - IDX10632 : SymmetricSecurityKey. GetKeyedHashAlgorithm( 'HS512') 在使用 HS512 ALGO 验证 JWT 时抛出异常

security - SensioFrameworkExtraBundle 与 JMSSecurityExtraBundle

android - 解压缩 .apk 文件的能力是否意味着任何人都可以在 Playstore 中找到所有专有应用程序的源代码?

具有 Azure Active Directory 身份验证的 Azure WCF 服务

c# - 在类级别和方法级别应用 ClaimsPrincipalPermissionAttribute 时出现异常