asp.net - 从中间件中排除控制器
问题描述
我写了一个中间件,它检查授权令牌是否包含在标头中,并根据该请求执行,如果令牌丢失则返回错误。现在它对其他控制器工作正常。但是我应该为不需要授权标头的登录/注册控制器做什么。如何配置我的中间件以忽略这些。
MiddleWare 的当前实现,用于检查授权令牌的标头。
public class AuthorizationHeaderValidator
{
private readonly RequestDelegate _next;
private readonly ILogger<AuthorizationHeaderValidator> _logger;
public AuthorizationHeaderValidator(RequestDelegate next, ILogger<AuthorizationHeaderValidator> logger)
{
_next = next;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
StringValues authorizationHeader;
Console.WriteLine(context.Request.Path.Value);
if (context.Request.Headers.TryGetValue("Authorization", out authorizationHeader))
{
await _next(context);
}
else
{
_logger.LogError("Request Failed: Authorization Header missing!!!");
context.Response.StatusCode = 403;
var failureResponse = new FailureResponseModel()
{
Result = false,
ResultDetails = "Authorization header not present in request",
Uri = context.Request.Path.ToUriComponent().ToString(),
Timestamp = DateTime.Now.ToString("s", CultureInfo.InvariantCulture),
Error = new Error()
{
Code = 108,
Description = "Authorization header not present in request",
Resolve = "Send Request with authorization header to avoid this error."
}
};
string responseString = JsonConvert.SerializeObject(failureResponse);
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(responseString);
return;
}
}
}
解决方案
这不是一个完整的答案,而只是方向。为下一代完成此任务后,请发布您的代码。
似乎您需要一个过滤器而不是中间件,因为中间件无权访问路由数据。通过从 Attribute 继承并实现 IAuthorizationFilter 或 IAsyncAuthorizationFilter 来创建新的授权过滤器。只有一种方法可以实现
public void OnAuthorization(AuthorizationFilterContext context)
{
}
或者
public Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
}
使用AllowAnonymousAttribute装饰要从此逻辑中排除的控制器和/或操作。在 OnAuthorization 方法中检查当前操作或控制器是否具有 AllowAnonymousAttribute 以及是否在未在 AuthorizationFilterContext 上设置 Result 的情况下返回。否则从原始中间件执行逻辑并设置 Result 属性。设置 Result 将使过滤器管道的其余部分短路。然后全局注册您的过滤器:
services.AddMvc(options =>
{
options.Filters.Add(new CustomAuthorizeFilter());
});
推荐阅读
- typescript - Vuex 共享操作
- c# - 如何显示来自 WinForms 项目的 toast 通知?
- core - Blazor - 可以在代码后面 NavigateTo 吗?
- python - 我不明白 kivymd 中的错误信息
- c - epoll 在包含数据的可用 fd 上设置 EPOLLHUP
- c++ - 我需要在基内存地址中为 [byte] 使用哪种数据类型?
- c# - 修复 SQL 参数化
- python-3.x - 在 AWS Lambda 上使用 GCC 和 Keras Theano 时出现 THEANO_FLAGS 错误
- javascript - 使用 reducer 更新状态内的特定值
- android - 带有父子片段的 Kotlin 中的片段接口空指针异常