【问题标题】:OpenID Connect Authentication Successful. Now what?OpenID Connect 认证成功。怎么办?
【发布时间】:2021-09-03 09:30:31
【问题描述】:

我正在用 C# 编写一个 Windows 服务,它需要通过 API 进行身份验证并进行一些调用。我能够使用我正在与之交谈的这个 API 成功地进行身份验证,但我似乎无法弄清楚如何使用响应。响应如下所示:

{"access_token":"Es-Zjs_LI0tcXyLe3aEfgKPNLHN7CwyUhTss-cTld1A","expires_in":1800,"token_type":"Bearer","scope":"example","auth_state":1,"company":"examplecompany"}

如果我愿意,我可以从该字符串中获取访问令牌,但无论我如何将它传递给请求,我都会收到 401 错误。这是我当前迭代的样子:

    string results = "";
    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer",token);
    var request = new HttpRequestMessage
    {
        Method = HttpMethod.Get,
        RequestUri = new Uri("https://example.ca/endpoint"),
        //Headers =
        //{
        //    { "authorization", "Bearer"},
        //},
    };
    try
    {
        using (var response = await client.SendAsync(request))
        {
            response.EnsureSuccessStatusCode();
            var body = await response.Content.ReadAsStringAsync();
            results = body;
        }
    }
    catch (Exception ex)
    {
        results = "ERROR: " + ex.Message;
    }
    
    return results;

在此示例中,“token”是字符串“Es-Zjs_LI0tcXyLe3aEfgKPNLHN7CwyUhTss-cTld1A”。我之前曾尝试将 access_token 值作为字符串拼接到中间注释掉的部分中的“Bearer”字符串。我究竟做错了什么?我需要从响应中制作一个 JwtSecurityToken 吗?

【问题讨论】:

    标签: c# api openid-connect bearer-token


    【解决方案1】:
    AuthenticationResult authResult = await daemonClient.AcquireTokenForClient(new[] { MSGraphScope })
                                            .ExecuteAsync();
    request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
    

    我用过authResult.AccessToken。不确定它是否适用于您的场景。当我检索到我正在使用的 Graph API 的令牌时,我的返回类型是 Microsoft.Identity.Client.AuthenticationResult 类型。

    【讨论】:

      【解决方案2】:

      请注意,您收到的令牌(“Es-Zjs_LI0tcXyLe3aEfgKPNLHN7CwyUhTss-cTld1A”)是参考令牌,而不是 JWT 令牌。确保您的 API 接受该类型的令牌。

      为了在生产中有效地使用令牌,我会考虑使用IdentityModel 库中的各种辅助方法,尤其是Worker application 辅助方法。

      【讨论】:

        【解决方案3】:

        虽然我知道这在很大程度上取决于您尝试连接的 API,但对我而言,解决方案是使用此方法传入身份验证令牌:

        request.Headers.TryAddWithoutValidation("Authorization", "Bearer " + token);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-20
          • 2016-06-09
          • 1970-01-01
          • 1970-01-01
          • 2021-09-07
          • 2017-05-18
          • 2018-12-19
          • 2019-06-14
          相关资源
          最近更新 更多