我有一个带有多个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)访问。一种优雅的方法是使用属性。
现在我想确定根据URL 捕获要调用的C#方法的正确Middleware
实现,并通过使用获取角色属性(如果有)反思,所以我可以阻止未经授权的电话。
请建议。
答案 0 :(得分:0)
我想引起注意,下面的方法仅在您出于某种原因不想使用内置Role based Authorization时(如评论评论中所标记)。
如果您创建全局Action Filter(这是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中间件的一部分。如果将中间件放在它之前,那么在该管道步骤中就没有“控制器”逻辑。如果之后 - 对你想要的东西来说太晚了。