无法读取使用System.IdentityModel.Tokens.Jwt

时间:2019-05-22 02:08:15

标签: c# authentication oauth jwt

我们已开始开发新项目,并正在考虑将Identity Server / OpenId用于授权和认证需求。由于在阅读Microsoft的Jwt类和支持并尝试一些示例代码之前,我还没有使用过Jwt令牌。我从Nuget安装了System.Identitymodel.Tokend.Jwt 5.4版本,并使用下面的示例代码生成了令牌(我在堆栈溢出时找到了该代码)

        string strToken = string.Empty;

        string strKey = "401b09eab3c013d4ca54922bb802bec8fd5318192b0a75f201d8b3727429090fb337591abd3e44453b954555b7a0812e1081c39b740293f765eae731f5a65ed1";
        var vSymmetricSecurityKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(Encoding.UTF8.GetBytes(strKey));
        var vSigningCredentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(vSymmetricSecurityKey, SecurityAlgorithms.HmacSha256Signature);
        var header = new JwtHeader(vSigningCredentials);
        var payload = new JwtPayload
        {
            { "Id", "userId" },
            { "Role", "userrole" },
            { "FirstName", "first_name" },
            { "LastName", "last_name" },
            { "EmailAddress", "email_address" },
            { "TenantId", "tenant_id" },
        };
        var secToken = new JwtSecurityToken(header, payload);
        var handler = new JwtSecurityTokenHandler();
        strToken = handler.WriteToken(secToken);

令牌已成功生成。但是当我去读取令牌时,出现以下错误

IDX12709:CanReadToken()返回false。 JWT的格式不正确:“ [PII隐藏]”。 令牌必须采用JWS或JWE Compact序列化格式。 (JWS):“ EncodedHeader.EndcodedPayload.EncodedSignature”。 (JWE):“ EncodedProtectedHeader.EncodedEncryptedKey.EncodedInitializationVector.EncodedCiphertext.EncodedAuthenticationTag”。

如果我将令牌粘贴到JWT中-它会告诉我无效的签名。什么可能不正确?

生成的令牌为 eyJhbGciOiJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNobWFjLXNoYTI1NiIsInR5cCI6IkpXVCJ9.eyJJZCI6InVzZXJJZCIsIlJvbGUiOiJ1c2Vycm9sZSIsIkZpcnN0TmFtZSI6ImZpcnN0X25hbWUiLCJMYXN0TmFtZSI6Imxhc3RfbmFtZSIsIkVtYWlsQWRkcmVzcyI6ImVtYWlsX2FkZHJlc3MiLCJUZW5hbnRJZCI6InRlbmFudF9pZCJ9.BXUFKLcVmnGxRG5yGRNYVLTU2gT_F_AmBGev6sWhQd0

2 个答案:

答案 0 :(得分:0)

您使用了错误的密钥类型和算法。 JWT使用公用/专用密钥,而不使用对称密钥。

此外,JWT索赔的内容(有效负载)有一个标准。您缺少诸如签发,到期时间等字段的项目。解决签名问题后,如果您需要有关JWT索赔的帮助,请创建一个新问题,因为这是一个完全不同的主题。

注意:strKey应该是密钥对的私钥。公钥用于验证JWT(称为JWS)的签名。

更改这些行:

var vSymmetricSecurityKey = new Microsoft.IdentityModel.Tokens.SymmetricSecurityKey(Encoding.UTF8.GetBytes(strKey));
var vSigningCredentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(vSymmetricSecurityKey, SecurityAlgorithms.HmacSha256Signature);

收件人:

var vRsaSecurityKey = new Microsoft.IdentityModel.Tokens.RsaSecurityKey(privateKey);
var vSigningCredentials = new Microsoft.IdentityModel.Tokens.SigningCredentials(vSymmetricSecurityKey, SecurityAlgorithms.RsaSha256Signature);

答案 1 :(得分:0)

就我而言,这是错误的OAuth承载令牌。仔细检查它,例如它在字符串开头可以有两次“ Bearer”