【问题标题】:ASP.NET Core 2.2 - Action Filter db Query QuestionASP.NET Core 2.2 - 操作过滤器数据库查询问题
【发布时间】:2019-09-11 02:19:37
【问题描述】:

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

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

这个想法是将控制器设置为:

controller -  action - CompanyId - ReportId

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

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

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

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

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

【问题讨论】:

  • 那么你有什么尝试,你卡在哪里了?您是在问如何在操作过滤器中访问数据库?
  • 就是这样。对不起,新手的问题,但我正在努力学习。大声笑。

标签: asp.net-core-mvc asp.net-core-2.2


【解决方案1】:

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

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
});

【讨论】:

  • 啊啊啊!我明白你在做什么。我看到您可以访问 httpContext 但不知道如何在其中获取对 dB 的访问权限。
猜你喜欢
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 2019-10-30
  • 2020-04-22
  • 2019-06-19
  • 2019-07-17
  • 2018-05-24
  • 1970-01-01
相关资源
最近更新 更多