【问题标题】:Access OAuth2 endpoint from an ASP.NET Core Web API application从 ASP.NET Core Web API 应用程序访问 OAuth2 端点
【发布时间】:2021-09-03 11:09:53
【问题描述】:

我有一个 ASP.NET Core Web API 应用程序,这个 Web API 需要调用另一个使用 OAuth2 进行身份验证的第 3 方 API。需要通过传递client_id和client_secret来调用这个第3方API的/token端点,授权类型为client_credentials。然后使用收到的不记名令牌发出后续请求,以从 3rd-party API 检索数据。

根据我的研究,可以使用HttpClient 实现此要求,并从 .NET Core Web API 控制器(或理想情况下在控制器访问的服务类中)调用第 3 方 API。

我的问题是是否有另一种方法/更好的方法来实现这一要求?我对上述方法的一个担忧是它会为每个请求调用第三方/token 端点。是否可以在Startup.cs 类中做一些实现?

【问题讨论】:

  • 我建议先阅读这篇文章Which OAuth2 0 flow should I use。在您选择最适合您需要的流程后,您可以创建一个从 HttpClient 扩展的类 ThirdPartyClient,并为您选择的身份验证流程附加逻辑。有了这个,您将拥有一个客户端来使用您可以在任何需要的地方注入的 3rd-party API。注意:在 Startup.cs 中只使用它来配置 DI 和必要的服务。

标签: c# asp.net-core asp.net-web-api oauth-2.0 oauth


【解决方案1】:

看看IdentityModel。它为HttpClient 提供扩展方法来处理client_credentials(和其他)OAuth 流,缓存令牌(直到它过期),因此您不会在每次请求时敲击/token 端点并在需要时刷新令牌。

您需要在您的Startup 类中配置它,或者如果您需要动态配置HttpClients,则实现ITokenClientConfigurationService

services.AddAccessTokenManagement(options =>
{
    options.Client.Clients.Add("identityserver", new ClientCredentialsTokenRequest
    {
        Address = "https://demo.identityserver.io/connect/token",
        ClientId = "m2m.short",
        ClientSecret = "secret",
        Scope = "api" // optional
    });
});

【讨论】:

  • 谢谢@abdusco。如果我们这样做,是在应用程序启动时检索第一个令牌,还是仅在实际需要调用 3rd-party api 时按需检索?
  • 它按需获取令牌。如果这很重要,您可以附加 IHostedService 并预取令牌。
  • 我可以使用它访问 API。但是当我扩展从 HttpClientFactory 返回的 httpClient 实例时,授权标头为空。我希望不记名令牌在授权标头中可用。那么这是如何工作的,标头中设置的令牌在哪里?
  • 它将DelegatingHandler 添加到HttpClients,其工作方式类似于中间件。它拦截您发送的请求,添加/检查响应以查看是否需要刷新令牌github.com/IdentityModel/IdentityModel.AspNetCore/blob/…
猜你喜欢
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多