我们已开始开发新项目,并正在考虑将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
答案 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”