在中间件管道中使用 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]
属性标记每个控制器。
我正在使用 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]
属性标记每个控制器。