将 JwtSecurityToken 与 HttpClient 一起使用
Using JwtSecurityToken with HttpClient
我正在尝试使用 JWT 令牌通过 HttpClient
查询 OpenApi 端点。我一直在尝试这样做一段时间,多次尝试不同的东西,比如 Base64
编码,只是将 JWT 令牌原始放入授权 header,但端点拆分回一个 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;
}
但我不知道要在本节中向授权 header 添加什么内容:
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
数据进行编码,但没有结果。这方面的文档都与服务有关,我似乎可以找到任何适用于我的问题的文档。
您已经有了令牌,ValidateCurrentToken
方法只是进行验证。字符串参数 token
是您的 JWT 令牌,它包含三个用点连接的部分,它们是 Header、Payload 和 Signature。 Header 和 Payload 是 base64 编码的。例如,它应该看起来像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
所以你已经有了需要使用的值,不需要把JwtSecurityToken
转成字符串。只需在授权 header 中使用 token
参数中的值。确保在 Bearer
关键字和令牌之间留空 space。
您可以参考 jwt.io 了解有关 JWT 令牌及其工作原理的更多信息。
关于 < WHAT TO PUT HERE > 看看这个 class JwtSecurityTokenHandler and see if it´s help in your case. The sugestion is to use the WriteToken 方法以紧凑的序列化形式获取 JWT 的字符串。
new JwtSecurityTokenHandler().WriteToken(token)
我正在尝试使用 JWT 令牌通过 HttpClient
查询 OpenApi 端点。我一直在尝试这样做一段时间,多次尝试不同的东西,比如 Base64
编码,只是将 JWT 令牌原始放入授权 header,但端点拆分回一个 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;
}
但我不知道要在本节中向授权 header 添加什么内容:
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
数据进行编码,但没有结果。这方面的文档都与服务有关,我似乎可以找到任何适用于我的问题的文档。
您已经有了令牌,ValidateCurrentToken
方法只是进行验证。字符串参数 token
是您的 JWT 令牌,它包含三个用点连接的部分,它们是 Header、Payload 和 Signature。 Header 和 Payload 是 base64 编码的。例如,它应该看起来像这样:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
所以你已经有了需要使用的值,不需要把JwtSecurityToken
转成字符串。只需在授权 header 中使用 token
参数中的值。确保在 Bearer
关键字和令牌之间留空 space。
您可以参考 jwt.io 了解有关 JWT 令牌及其工作原理的更多信息。
关于 < WHAT TO PUT HERE > 看看这个 class JwtSecurityTokenHandler and see if it´s help in your case. The sugestion is to use the WriteToken 方法以紧凑的序列化形式获取 JWT 的字符串。
new JwtSecurityTokenHandler().WriteToken(token)