我编写了一个中间件,用于检查标头中是否包含授权令牌,并根据该请求执行该令牌,如果令牌丢失,则返回错误。现在,它对于其他控制器也可以正常工作。 但是,对于不需要Authorization标头的Login / Registration Controller,我应该怎么做。如何配置我的中间件以忽略这些。
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;
}
}
}
答案 0 :(得分:0)
不确定是否需要中间件来验证Authorization标头是否存在。这样很难排除控制器,因为所有请求在到达MVC管道之前都将通过此中间件。
假设您已经集成了某种形式的身份验证,那么 [Authorize]
属性将为您完成这项工作。如果您需要排除不需要授权的控制器,则只需在控制器级别或操作方法级别添加[AllowAnonymous]
。请从Microsoft Docs
[Authorize]
public class AccountController : Controller
{
[AllowAnonymous]
public ActionResult Login()
{
}
public ActionResult Logout()
{
}
}
如果必须使用中间件,则可以考虑将其用作MVC筛选器,这意味着它将限于MVC管道。有关更多详细信息,请参见此link。但是,这仍然不能解决不添加一些复杂逻辑就排除控制器的问题,这可能会非常复杂。
答案 1 :(得分:0)
这不是一个完整的答案,而只是指示。为下一代完成此任务后,请发布代码。
似乎您需要一个Filter而不是Middlware,因为Middleware无法访问路由数据。通过继承Attribute并实现IAuthorizationFilter或IAsyncAuthorizationFilter来创建新的授权过滤器。只有一种实现方法
public void OnAuthorization(AuthorizationFilterContext context)
{
}
或
public Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
}
使用AllowAnonymousAttribute装饰要从此逻辑中排除的控制器和/或动作。在您的OnAuthorization方法内部,检查当前操作或控制器是否具有AllowAnonymousAttribute,以及是否在未在AuthorizationFilterContext上设置Result的情况下返回了它。否则,请从原始中间件执行逻辑并设置Result属性。设置结果将使过滤器管道的其余部分短路。 然后在全局范围内注册您的过滤器:
services.AddMvc(options =>
{
options.Filters.Add(new CustomAuthorizeFilter());
});
答案 2 :(得分:0)
我已经通过实施管道解决了我的问题
public class AuthorizationMiddlewarePipeline
{
public void Configure(IApplicationBuilder applicationBuilder)
{
applicationBuilder.UseMiddleware<AuthorizationHeaderValidator>();
}
}
并且比起我在Controller Scope或Method Scope上这样使用它
[MiddlewareFilter(typeof(AuthorizationMiddlewarePipeline))]