【发布时间】:2021-12-03 19:53:59
【问题描述】:
我正在尝试使用 JWT 令牌来查询带有 HttpClient 的 OpenApi 端点。我一直在尝试这样做一段时间,多次尝试不同的东西,比如Base64 编码,只是将 JWT 令牌原始放入 Authorization 标头中,但端点每次都会用“身份验证失败”拆分403 Forbidden . JWT 的验证工作正常,通过Microsoft.IdentityModel.Tokens 完成:
public JwtSecurityToken ValidateCurrentToken(string token)
{
var jwksJson = GetKeyInfo();
var tokenHandler = new JwtSecurityTokenHandler();
var keyset = JsonWebKeySet.Create(eveJwksJson);
var tokenParameters = new TokenValidationParameters();
tokenParameters.ValidateIssuerSigningKey = true;
tokenParameters.ValidateIssuer = true;
tokenParameters.ValidateAudience = false;
tokenParameters.ValidateLifetime = true;
tokenParameters.ValidateActor = false;
tokenParameters.ValidIssuers = new List<string>{ "host1", "host2" };
tokenParameters.IssuerSigningKey = keyset.Keys.First();
SecurityToken validatedToken;
try
{
tokenHandler.ValidateToken(token, tokenParameters, out validatedToken);
}
catch(Exception e)
{
throw new AuthenticationException("Token is not valid: " + e.Message);
}
var securityToken = (JwtSecurityToken) validatedToken;
}
但我不知道要在本节的 Authorization 标头中添加什么:
public async Task<HttpResponseMessage> GetResponse(HttpClient httpClient, Uri uri, JwtSecurityToken token)
{
HttpRequestMessage httpRequestMessage = new HttpRequestMessage()
httpRequestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", <WHAT TO PUT HERE>);
httpRequestMessage.Method = HttpMethod.Get;
httpRequestMessage.RequestUri = uri
return await httpClient.SendAsync(httpRequestMessage);
}
有些人建议我尝试urlBase64 对令牌中的JSON 数据进行编码,但没有结果。这一切的文档都与服务有关,我似乎可以找到任何适用于我的问题的文档。
【问题讨论】:
-
你的 JwtSecurityToken 令牌来自你的签名。您可以检查令牌以确保它在 jwt.io 上有效
-
@GHDevOps 我需要更多细节,对不起。 JwtSecurityToken 没有 Token 属性。当我查看可以使用的 JwtSecurityToken 数据时,我真的不知道我在寻找什么。我在 JWT 方面不是很强,所以如果这是一个愚蠢的问题,我很抱歉。
-
有什么问题。你收到了什么错误?
-
@Serge 我收到 403 Forbidden,内容中显示“身份验证失败”消息。我很确定这是因为我在 Authorization 标头中没有做正确的事情。我可以在其某些端点上调用 API 而无需授权,并且效果很好。
-
API 恐怕需要特别授权。如果只是 jwt 则返回 401 错误。