ASP.NET Core 2.2 - Фильтр действий. - PullRequest
1 голос
/ 21 апреля 2019

В нашем приложении есть пользователи, которые сопоставлены с компаниями.Когда пользователь входит в систему и начинает делать запросы, мне нужен способ проверить, отображается ли этот пользователь в компании для доступа к ресурсам компании.

У меня была идея создать целый контроллер для управления всем этим, но кто-то упомянул ActionFilters как гораздо лучший и более чистый вариант, я должен согласиться, посмотрев его.

Идея состоит в том, чтобы настроить контроллер следующим образом:

controller -  action - CompanyId - ReportId

Таким образом, любой запрос на получение root-прав системы будет просто просматриваться, если есть какие-либо компании, сопоставленные этому зарегистрированному пользователю.

Но еслизапрос включал CompanyId, после чего они переходили на страницу учетной записи «портала» этой компании.Это действительно любой запрос, который включает CompanyId, где я хочу, чтобы actionFilter определил, разрешен ли этому пользователю доступ.

  1. Запрос приходит ...
  2. В запросе указан CompanyId!
  3. ActionFilter:

Искать в дБдля всех пользователей, назначенных этому CompanyId.Текущий пользователь в этом списке?Нет?= выкинуть.

Я пытался набрать пример кода, но система сказала мне вручную делать отступ каждой строки на 4 пробела, я все равно делал это из памяти, так что понятия не имел, насколько это было бы полезно в любом случае.

1 Ответ

0 голосов
/ 22 апреля 2019

Вы можете получить параметры действия в фильтре действий, а затем получить базу данных через 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] атрибут или значение глобальный фильтр

services.AddMvc(options =>
{
    options.Filters.Add(new TestActionFilter()); // an instance
});
...