Фильтр на основе пути - PullRequest
0 голосов
/ 14 мая 2019

Я делаю систему на основе различных контроллеров API.С надлежащим токеном JWT на месте.(этот токен содержит пользователя и клиентов, к которым он имеет доступ). В настоящее время, по соглашению, контролерам необходимо проверить, имеет ли данный пользователь доступ к рассматриваемому клиенту.

Интересно, смогу ли ясделайте это немного более элегантно :) - скажем, если базовый URL-адрес всегда / api / customer //, то лучшим решением будет создание «чего-то», которое всегда проверяет, является ли оно частью данного заявления пользователя.

1 Ответ

0 голосов
/ 14 мая 2019

Вы можете использовать Авторизация на основе политик в ASP.NET Core.

Чтобы удовлетворить ваши требования, сначала создайте политику авторизации:

services.AddAuthorization(options =>
{
    options.AddPolicy("CustomRequire", policy =>
        policy.Requirements.Add(new CustomerRequirement()));
});

Зарегистрируйте одно требование, создайте CustomerRequirement.cs:

public class CustomerRequirement : IAuthorizationRequirement
{
    public CustomerRequirement()
    {
    }
}

Создать CustomerHandler.cs:

public class CustomerHandler : AuthorizationHandler<CustomerRequirement>
{
    IHttpContextAccessor _httpContextAccessor = null;

    public CustomerHandler(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                CustomerRequirement requirement)
    {

        HttpContext httpContext = _httpContextAccessor.HttpContext;


        var path = httpContext.Request.Path;

        //split the path to get the customer base on your path .

        var customerName = "customerFromPath";

        if (!context.User.HasClaim(c => c.Type == "customer"))
        {
            return Task.CompletedTask;
        }

        var customer = context.User.FindAll(c => c.Type == "customer" ).FirstOrDefault();

        if (customerName.Equals(customer.Value.ToString()))
        {
            context.Succeed(requirement);
        }

        //TODO: Use the following if targeting a version of
        //.NET Framework older than 4.6:
        //      return Task.FromResult(0);
        return Task.CompletedTask;
    }
}

Чтобы использовать IHttpContextAccessor, вам может потребоваться зарегистрировать это в настройках DI следующим образом:

services.AddHttpContextAccessor();

Зарегистрировать обработчик в наборе сервисов во время настройки:

services.AddSingleton<IAuthorizationHandler, CustomerHandler>();

Теперь вы можете применять политики к контроллерам MVC:

[Authorize(Policy = "CustomRequire")]
// GET api/values/5
[HttpGet("{id}")]
public ActionResult<string> Get(int id)
{
    return "value";
}

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

...