ASP.NET Core 2.2 - Action Filter 数据库查询问题

ASP.NET Core 2.2 - Action Filter db Query Question

我在我们的应用程序中有用户,他们被映射到公司。当用户登录并开始发出请求时,我想要一种方法来验证该用户当前是否映射到公司以访问公司资源。

我的想法是创建一个完整的控制器来管理所有这些,但有人提到 ActionFilters 是一个更好更干净的选择,我在看过之后不得不同意。

想法是将控制器设置为:

controller -  action - CompanyId - ReportId

因此,如果有任何公司映射到该登录用户,任何根系统请求都会查找。

但是如果请求包含 CompanyId,那么他们会转到该公司的“门户”帐户页面。它实际上是包含 CompanyId 的任何请求,我希望 actionFilter 确定是否允许该用户访问。

  1. 请求进来...
  2. 请求中有CompanyId!
  3. 动作过滤器:

在数据库中查找分配给该 CompanyId 的所有用户。当前用户在该列表中吗?不? = 把他们踢出去。

我试着输入一个代码示例,但系统告诉我手动将每行缩进 4 个空格,反正我是凭记忆做的,所以不知道它会有多大帮助。

您可以在您的操作过滤器中获取您的操作参数,然后通过 HttpContext.RequestServices.GetRequiredService<ApplicationDbContext>() 获取您的数据库。请参阅

public class TestActionFilter:Attribute,IActionFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        //If companyId is action parameter
        var companyId= context.ActionArguments["companyId"].ToString();
        //If companyId1 is query string
        var companyId1= context.HttpContext.Request.Query["companyId1"].ToString();
        //If companyId2 is in request header
        var companyId2= context.HttpContext.Request.Headers["companyId2"].ToString();

        //get your dbcontext
        var db = context.HttpContext.RequestServices.GetRequiredService<ApplicationDbContext>();

        //EF core logic
        //...
    }
    public void OnActionExecuted(ActionExecutedContext context)
    {

    }
}

您可以直接使用 [TestActionFilter] 属性或设置为 global filter

将其用于操作
services.AddMvc(options =>
{
    options.Filters.Add(new TestActionFilter()); // an instance
});