【发布时间】:2019-07-13 16:38:20
【问题描述】:
我正在尝试使用 JwtSecurityTokenHandler 将我的令牌字符串转换为 jwt 令牌。但是这样说会出错
IDX12709:CanReadToken() 返回错误。 JWT 格式不正确:“[PII is hidden]”。\n令牌需要采用 JWS 或 JWE 紧凑序列化格式。 (JWS):'EncodedHeader.EndcodedPayload.EncodedSignature'。 (JWE): 'EncodedProtectedHeader.EncodedEncryptedKey.EncodedInitializationVector.EncodedCiphertext.EncodedAuthenticationTag'。
我该如何解决这个问题?
这是我的令牌
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1bmlxdWVfbmFtZSI6ImFkbWluIiwibmJmIjoxNTUwNjM3NzcxLCJleHAiOjE1NTA2Mzg5NzEsImlhdCI6MTU1MDYzNzc3MX0.tUcoyoHgkrX3rDKl0cRLd9FwLtRprQpgYepMoiekixY P>
var tokenHandler = new JwtSecurityTokenHandler();
var jwtToken = tokenHandler.ReadToken(token) as JwtSecurityToken;
调用 web api
using (HttpClient client = new HttpClient())
{
string path = "UserMaintenance/ValidateUserId?userid=" + txtUsername.Text.Trim().ToString();
client.BaseAddress = new Uri(GlobalData.BaseUri);
client.DefaultRequestHeaders.Add("Authorization", "Bearer" + GlobalData.Token);
HttpResponseMessage response = client.GetAsync(path).Result;
if (response.IsSuccessStatusCode)
{
var value = response.Content.ReadAsStringAsync().Result;
isValid = JsonConvert.DeserializeObject<bool>(value);
}
}
这是我的 GetPrincipal 方法
public static ClaimsPrincipal GetPrincipal(string token)
{
try
{
var symmetricKey = Convert.FromBase64String(Secret);
var validationParameters = new TokenValidationParameters()
{
RequireExpirationTime = true,
ValidateIssuer = false,
ValidateAudience = false,
IssuerSigningKey = new SymmetricSecurityKey(symmetricKey)
};
var handler = new JwtSecurityTokenHandler();
handler.InboundClaimTypeMap.Clear();
SecurityToken securityToken;
var principal = handler.ValidateToken(token, validationParameters, out securityToken);
return principal;
}
catch (Exception ex)
{
return null;
}
}
【问题讨论】:
-
能否将令牌添加到您的问题中?
-
你的代码和我的代码都在使用这个令牌。异常到底是在哪一行抛出的?
-
您是否跟踪了代码并检查了 jwt 是否在上述行中具有所需的值?并从令牌的开头删除了 “Bearer” 字样?
-
我更新了我的答案。从标头中读取授权值后,您需要从字符串的开头删除承载,然后尝试将其解析为 jwt 令牌。
-
初始化授权头时,缺少Bearer后面的空格。让我再澄清一点:想象一下 XXX 是你的代币。第一步,当你想调用一个api时,你需要在授权头中添加这个字符串:“Bearer XXX”。而在第二步中,当您要消费和解析令牌时,您需要从授权标头的开头删除 "Bearer" 并准确解析 XXX 的值,不带任何前缀。
标签: asp.net asp.net-web-api2 jwt