Asp.Net 核心 Jwt access_token 签名和加密

Asp.Net Core Jwt access_token signing and encryption

TLDR;我试图了解 HOW Jwt 中间件能够获取我已经使用以下 signature/encryption 方案:

SigningCredentials TokenSigningKey = new SigningCredentials( "MySignatureSecurityKey", SecurityAlgorithms.HmacSha512);
EncryptingCredentials TokenEncryptingKey = new EncryptingCredentials( "MyEncryptionSecurityKey", JwtConstants.DirectKeyUseAlg, SecurityAlgorithms.Aes256CbcHmacSha512 );

在我的 Startup.cs ConfigureServices 方法中,我已将我的服务配置为 AddAuthentication(options).AddJwtBearer:

services.AddAuthentication( options =>
{
    ...
} )
.AddJwtBearer( options =>
{
    ...
    options.TokenValidationParameters =
        new TokenValidationParameters
        {
            ...
            IssuerSigningKey = "MySignatureSecurityKey"
            TokenDecryptionKey = "MyEncryptionSecurityKey"
            ...
        };
} );

我不需要在任何地方配置 signature/encryption 方案,我只是将要使用的密钥传递给它。当我实际上 sign/encrypt 令牌时,我只配置 signature/encryption 方案,并且它和中间件之间没有连接。

此外,如果您能就此定义是否正确或在何处找到有关当前最佳实践配置的文档提出任何建议,我们将不胜感激:

SigningCredentials TokenSigningKey = new SigningCredentials( "MySignatureSecurityKey", SecurityAlgorithms.HmacSha512);
EncryptingCredentials TokenEncryptingKey = new EncryptingCredentials( "MyEncryptionSecurityKey", JwtConstants.DirectKeyUseAlg, SecurityAlgorithms.Aes256CbcHmacSha512 );

由于文档非常粗糙,我不得不从网上的各种零碎内容中拼凑出来。

天哪,真不敢相信我错过了。我一定是在应用加密后检查它时错误地解码了 access_token,因为我刚刚又做了一次,答案就在眼前。

access_token 的第一部分如下所示: eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIiwidHlwIjoiSldUIn0.. 解码后,它看起来像这样: {“alg”:“dir”,“enc”:“A256CBC-HS512”,“typ”:“JWT”}

总荷马辛普森时刻 XS

所以回答这个问题: Jwt 中间件采用加密令牌(它以 bearer token 形式呈现)并通过解码第一部分(见上文),可以看到以下内容:

  1. 算法 = "dir" / DirectKeyUse
  2. 加密=“A256CBC-HS512”/Aes256CbcHmacSha512

中间件知道要处理它,因为“typ”是“JWT”。

希望这对其他人也有帮助。