Авторизация на основе атрибутов в DotNetCore API - PullRequest
0 голосов
/ 30 ноября 2018

Я конвертирую .NET код API в .NET Core API.Есть несколько API, которые имеют атрибут авторизации в старой системе.Как я понимаю, .NET Core не имеет атрибутов авторизации.Итак, как мне сделать то же самое?

Я также приведу ниже пример атрибута из более старой системы:

[RequiredPermission("100,101,102")]

Я читал о policy-based в надежде на авторизациючтобы сделать то, что сделала старая система.По сути, я хотел бы передать список разрешенных разрешений для действия контроллера API.Каждый вызов будет оцениваться по этому списку, чтобы узнать, есть ли у пользователя эти разрешения.

1 Ответ

0 голосов
/ 30 ноября 2018

Для совместимости со старой системой вы можете создать простую авторизацию Filter:

public class RequiredPermissionAttribute : Attribute, IAsyncAuthorizationFilter{

    public RequiredPermissionAttribute(string permissions)
    {
        this.Permissions = string.IsNullOrEmpty(permissions) ?
            new List<string>():
            permissions.Split(",").Select(p =>p.Trim()).ToList();
    }

    public IList<string> Permissions {get;set;}

    public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        var user = context.HttpContext.User;

        var authZService = context.HttpContext.RequestServices.GetRequiredService<IAuthorizationService>();
        var accessable = await authZService.AuthorizeAsync(user,this.Permissions,"Require Permissions Policy");
        if(!accessable.Succeeded){
            context.Result =  new ForbidResult();
        }
    }
}

и теперь вы можете использовать фильтр авторизации для перехвата запроса:

[RequiredPermission("101,102,103")]
public IActionResult Contact()
{
    ViewData["Message"] = "Your contact page.";

    return View();
}

Конечно, мы должны сначала зарегистрировать политику.:

services.AddAuthorization( o=> {
    o.AddPolicy("Require Permissions Policy", pb =>{
        pb.RequireAssertion(async context =>{
            var user = context.User;
            var permissions=context.Resource as IList<string>;
            if(permissions == null || permissions.Count()==0 ){ return true; }
            if(user.Claims.Any( c => c.Type=="MyCustomClaimType" && permissions.Any(p => p.Equals(c.Value)) ))
            {
                return true;
            }
            return false;
        });
    });
});

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...