Та же политика, но разные обязательные параметры для каждого метода действия - PullRequest
0 голосов
/ 24 августа 2018

В проекте .Net core Webapi 2.1 у меня есть множество методов действий.
Все методы действий должны быть авторизованы для одной и той же политики (с именем FooPolicy), но с другим обязательным аргументом.
Основано на Microsoftdocs: Policy-Based-Authorization Одним из способов было бы объявить тонны политик на основе другого входного аргумента:

services.AddAuthorization(options =>
{
    options.AddPolicy("FooPolicy1", policy =>policy.Requirements.Add(new FooRequirement(1)));
    options.AddPolicy("FooPolicy2", policy =>policy.Requirements.Add(new FooRequirement(2)));
    options.AddPolicy("FooPolicy3", policy =>policy.Requirements.Add(new FooRequirement(3)));
    //... May be 30 more same policies here ...
});

Как я упоминал ранее, только другая часть находится в new FooRequirement(diffArgs).Другой проблемой для этого решения будет добавление каждого FooPolicy в соответствующий метод действия, и вы можете пропустить пару тем:

[Authorize(Policy = "FooPolicy1")]
public IActionResult ActionMethodFoo1(...) {...}

[Authorize(Policy = "FooPolicy2")]
public IActionResult ActionMethodFoo2(...) {...}

[Authorize(Policy = "FooPolicy3")]
public IActionResult ActionMethodFoo3(...) {...}
...List still goes on...

Есть ли какое-либо решение, например: Объявитеполитика, но использовать ее с другим экземпляром FooRequirement (который имеет тип IAuthorizationHandler)?вот так:

services.AddAuthorization(options =>
{
    options.AddPolicy("FooPolicy", policy =>policy.Requirements.Add(?));
});

И о методах действия:

[Authorize(Policy = "FooPolicy", required = new FooRequirement(1))]
public IActionResult ActionMethodFoo1(...) {...}

[Authorize(Policy = "FooPolicy", required = new FooRequirement(2))]
public IActionResult ActionMethodFoo2(...) {...}

[Authorize(Policy = "FooPolicy", required = new FooRequirement(3))]
public IActionResult ActionMethodFoo3(...) {...}

Основная идея - объявить политику один раз .Два последних кодовых блока являются псевдокодом. Кто-нибудь знает практическое решение с подобной концепцией?

1 Ответ

0 голосов
/ 27 августа 2018

Вы можете реализовать свой собственный IAuthorizationFilter

  1. custom IAuthorizationFilter

    public class CustomAuthorize : IAuthorizationFilter         
     {
            private readonly int _input;
    
    public CustomAuthorize(int input)
    {
        _input = input;
    }
    
    public void OnAuthorization(AuthorizationFilterContext context)
    {
        //custom validation rule
        if (_input == 1)
        {
            context.Result = new ForbidResult();
        }
    }
    }
    
  2. Custom CustomAuthorizeAttribute

    public class CustomAuthorizeAttribute : TypeFilterAttribute
    {
    public CustomAuthorizeAttribute(int input) : base(typeof(CustomAuthorize))
    {
        Arguments = new object[] { input };
    }
    }
    
  3. Использование

    [CustomAuthorizeAttribute(1)]
    public IActionResult About()
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...