ASP.NET Core 2.2-操作筛选器数据库查询问题

时间:2019-04-21 17:31:54

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

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

我的想法是创建一个整体控制器来管理所有这些,但是有人提到ActionFilters是更好,更清洁的选择,我必须在研究它后同意。

想法是将控制器设置为:

controller -  action - CompanyId - ReportId

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

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

  1. 请求进入...
  2. 请求中有一个CompanyId!
  3. ActionFilter:

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

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

1 个答案:

答案 0 :(得分:0)

您可以在操作过滤器中获取操作参数,然后通过await获取数据库。请参考here

try {
    youService().await()
} catch(ex: HttpException) {
    // do your handling here
}

您可以直接使用HttpContext.RequestServices.GetRequiredService<ApplicationDbContext>()属性或将其设置为global filter

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)
    {

    }
}