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 确定是否允许该用户访问。
- 请求进来...
- 请求中有CompanyId!
- 动作过滤器:
在数据库中查找分配给该 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
});
我在我们的应用程序中有用户,他们被映射到公司。当用户登录并开始发出请求时,我想要一种方法来验证该用户当前是否映射到公司以访问公司资源。
我的想法是创建一个完整的控制器来管理所有这些,但有人提到 ActionFilters 是一个更好更干净的选择,我在看过之后不得不同意。
想法是将控制器设置为:
controller - action - CompanyId - ReportId
因此,如果有任何公司映射到该登录用户,任何根系统请求都会查找。
但是如果请求包含 CompanyId,那么他们会转到该公司的“门户”帐户页面。它实际上是包含 CompanyId 的任何请求,我希望 actionFilter 确定是否允许该用户访问。
- 请求进来...
- 请求中有CompanyId!
- 动作过滤器:
在数据库中查找分配给该 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
});