将 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)