.Net Core Web API, авторизовать действие, если любая из ролей ИЛИ политика совпадает - PullRequest
0 голосов
/ 12 июня 2019

Я разработал остальные API, используя .Net Core, и мой API используется двумя источниками, один из пользовательского интерфейса, а другой из служб.

Для авторизации пользовательского интерфейса я использовал подход JWToken с заявками, а в качестве сервисов я использовал встроенную авторизацию безопасности на основе ролей.

т. Е. Для пользовательского интерфейса мне нужно предоставить [Authorize (Policy = "XYZ")] где, что касается услуг, мне нужно предоставить [Authorize (Role = "ABC")]

Большинство моих API-интерфейсов используются либо пользовательским интерфейсом, либо сервисами специально, но есть немного API-интерфейсов, которые могут использоваться как пользовательским интерфейсом, так и сервисами, но для таких API-интерфейсов мне необходимо предоставить условие, подобное либо роли, либо политике спички,

Например, Authorize [Role = "ABC", Policy = "XYZ"] , но этот оператор предполагает, что и роль, и политика будут доступны с условием AND, но мне нужно решение для реализации то же самое с видом ИЛИ условия. Пожалуйста, помогите мне, если кто-нибудь сталкивался с этим типом сценария.

К вашему сведению, я пытался использовать пользовательские атрибуты, но это не сработало, потому что у меня есть пользовательские атрибуты, независимо созданные для ролей (с помощью AuthorizeAttribute) и для политик (с использованием TypeFilterAttribute и IAsyncAuthorizationFilter) , но опять же я не могу комбинировать то же самое с условием ИЛИ

1 Ответ

0 голосов
/ 13 июня 2019

Чтобы реализовать условие OR, вы можете использовать пользовательский атрибут Authorize, который принимает Role и Policy в качестве аргументов. Возврат 403, если ни один из них не сопоставлен.

Ниже приведена простая демонстрация:

1.Создать AuthorizeMultiplePolicyAttribute класс

public class AuthorizeMultiplePolicyAttribute : TypeFilterAttribute
{
    public AuthorizeMultiplePolicyAttribute(string role, string policy) : base(typeof(AuthorizeMultiplePolicyFilter))
    {
        Arguments = new object[] { role, policy };
    }
}

2.Создать AuthorizeMultiplePolicyFilter

public class AuthorizeMultiplePolicyFilter : IAsyncAuthorizationFilter
{
    private readonly IAuthorizationService _authorization;
    public string _role { get; private set; }
    public string _policy { get; private set; }

    public AuthorizeMultiplePolicyFilter(string role, string policy, IAuthorizationService authorization)
    {
        _role = role;
        _policy = policy;
        _authorization = authorization;

    }

    public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        var policyAuthorized = await _authorization.AuthorizeAsync(context.HttpContext.User, _policy);
        var roleAuthorized = context.HttpContext.User.IsInRole(_role);

        if(!policyAuthorized.Succeeded && !roleAuthorized)
        {
            context.Result = new ForbidResult();
            return;
        }

    }
}

3. Используйте пользовательский атрибут

[AuthorizeMultiplePolicy("Admin","XYZ")]

Для нескольких ролей / политик вы можете обратиться к Как создать собственный атрибут Authorize для нескольких политик в ASP.NET CORE

...