Asp.net-Core

asp.net核心檢查中間件中的路由屬性

  • February 10, 2022

我正在嘗試建構一些 ASP.Net 核心中間件。

它需要查看目前路由是否標記為

$$ Authorize $$. 例如:

public async Task Invoke(HttpContext context)
{
   if(context.Request.Path.Value.StartsWith("/api"))
   {
       // check if route is marked as [Authorize]
       // and then do some logic
   }

   await _next.Invoke(context);
}

有誰知道這是如何實現的,或者是否有可能?

如果沒有,什麼是一個好的替代方法?

我相信它可以通過以下方式在中間件類中實現:

var hasAuthorizeAttribute = context.Features.Get<IEndpointFeature>().Endpoint.Metadata
               .Any(m => m is AuthorizeAttribute);

在不確切知道您想要實現什麼的情況下,回答起來有點棘手,但我建議您看看控制器過濾器:https ://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/過濾器

我整理了一個例子:

啟動.cs

public void ConfigureServices(IServiceCollection services)
{
   services
       .AddMvc()
       .AddMvcOptions(options => options.Filters.Insert(0, new CustomFilter()));
}

自定義過濾器.cs

public class CustomFilter : IActionFilter
{
   public void OnActionExecuting(ActionExecutingContext context)
   {
       if(context.HttpContext.Request.Path.Value.StartsWith("/api"))
       {
           var controllerInfo = context.ActionDescriptor as ControllerActionDescriptor;
           var hasAuthorizeAttr = controllerInfo.ControllerTypeInfo.CustomAttributes.Any(_ => _.AttributeType == typeof(AuthorizeAttribute));
       }
   }

   public void OnActionExecuted(ActionExecutedContext context)
   {
       // NOP
   }
}

引用自:https://stackoverflow.com/questions/45495301