在中间件管道中使用 HttpClient?

Use HttpClient within middleware pipeline?

我正在使用 ASP.NET Core 开发一个 API 项目,我必须使用公司拥有的自定义 OAuth 服务(也是一个 ASP.NET Core)。应该在向 API 发出的每个请求上调用该服务,以验证用户是否有权使用该资源,所以我想我可以在 API 上创建一个中间件来处理该请求OAuth 服务。

我的问题是我还在学习 C# 和 ASP.NET 核心,我不确定是否可以完成。我做了一些谷歌搜索,但找不到在中间件上完成 HttpClient 调用的示例。我想知道是否有人可以给我一个提示,告诉我我是否走在正确的道路上,或者这是否被认为是不好的做法,并且有更好的方法来实现它。

您需要编写自定义身份验证方案并将其添加到 ConfigureServices

中的身份验证中

基本上你需要实现AuthenticationHandler并注入HttpClient

public class CustomAuthHandler : AuthenticationHandler<CustomAuthOptions>
{


    public const string SchemeName = "CustomSchemeName";
    private readonly HttpClient _httpclient;

    public LocalAccessTokenValidationHandler(IOptionsMonitor<LocalAccessTokenValidationOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock,  HttpClient httpclient)
        : base(options, logger, encoder, clock)
    {
        _httpclient= httpclient;
    }

    protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        // use _httpclient here and authenticate request and return AuthenticateResult
    }

然后将此添加到您的身份验证服务

services.AddAuthentication(CustomAuthHandler.SchemeName) // setting CustomAuthHandler as the default
        .AddScheme<CustomAuthOptions, CustomAuthHandler>(CustomAuthHandler.SchemeName); 

HttpClient 注册为单身人士:

services.AddSingleton(new HttpClient());

然后你需要确保你所有的控制器都被标记为[Authorize]

查看此 blog 了解更多详情。 检查此 filters 了解如何将所有控制器标记为全局授权。这样您就不必用 [Authorize] 属性标记每个控制器。