用于过滤asp.net核心REST方法的中间件

本文关键字:方法 中间件 REST 核心 过滤 asp net 用于 | 更新日期: 2023-09-27 18:08:25

我有一个带有几个REST操作的。net核心应用程序(见下面的代码),类似于以下内容:


    namespace Controllers
    {
      [Route("system")]
      public class SystemController : Controller
      {
        // This is a public access method
        [HttpGet("dictionaries/{name}")]
        public List GetDictionary(HttpRequestMessage requestMsg, string name)
        {
          // etc
        }
        // This function shall be accessible only by an admin role
        [AdminRole]
        [HttpPost("dictionaries/{name}")]
        public IActionResult PostDictionary(HttpRequestMessage requestMsg, string name)
        {
          // etc
        }
      }
    }

我想标记一些操作只能由某些角色(即admin)访问。一种优雅的方法是使用属性。

现在我想确定什么是正确的Middleware实现捕获c#方法根据URL调用,并通过使用反射获取角色属性(如果有的话),所以我可以阻止未经授权的调用。

请建议。

用于过滤asp.net核心REST方法的中间件

我想提醒大家注意,下面的方法仅适用于您出于某种原因不想使用内置的基于角色的授权(如问题注释中所标记的)。


如果您创建了一个全局动作过滤器(这是MVC的一部分,因此可以与"控制器逻辑"操作),您可以从ActionExecutingContext获得所有需要的信息:

public class SampleActionFilter : IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        //Provides information about an action method, such as its name, controller, parameters, attributes, and filters.
        var actionDescriptor = context.ActionDescriptor;
        //Gets the controller instance containing the action.
        var controller = context.Controller; 
        // Gets the arguments to pass when invoking the action. Keys are parameter names.
        var actionArgs = context.ActionArguments; 
    }
    ...
}

context.ActionDescriptor可以被强制转换为ControllerActionDescriptor。它允许直接使用以下属性:

public class ControllerActionDescriptor : ActionDescriptor
{
    public string ControllerName { get; set; }
    public virtual string ActionName { get; set; }
    public MethodInfo MethodInfo { get; set; }
    public TypeInfo ControllerTypeInfo { get; set; }
    ...
}

不确定你可以使用中间件,因为控制器是MVC中间件的一部分。如果您将中间件放在它之前,那么在管道步骤中还没有"控制器"逻辑。如果过了——那就太晚了。