ASPNet Core: используйте [Authorize] с функцией в обслуживании - PullRequest
5 голосов
/ 26 июня 2019

Я использую аутентификацию JwtBearer для защиты моего API. Я добавляю [Authorize] над каждым API, и это работает.

Я использую этот код для добавления аутентификации при запуске:

services.AddAuthentication("Bearer")
        .AddJwtBearer("Bearer", options =>
        {
            options.Authority = "http://localhost:1234";
            options.RequireHttpsMetadata = false;
            options.Audience = "test";
        });

Мне нужен способ добавить [Authorize] к функции в сервисе или написать код в функции, который работает так же, как [Authorize].

1 Ответ

4 голосов
/ 26 июня 2019

Использование [Authorize] без передачи каких-либо параметров сводится к вызову, который проверяет, является ли пользователь аутентифицированным . Внутри сервиса это будет выглядеть примерно так:

// If any of the properties being accessed are null, assume that the user
// is not authenticated.
var isAuthenticated = httpContext?.User?.Identity?.IsAuthenticated ?? false;

Для доступа к HttpContext внутри службы вы можете использовать IHttpContextAccessor. Вот полный пример:

public class Service
{
    private readonly IHttpContextAccessor httpContextAccessor;

    public Service(IHttpContextAccessor httpContextAccessor)
    {
        this.httpContextAccessor = httpContextAccessor;
    }

    public void ServiceFunction()
    {
        var httpContext = httpContextAccessor.HttpContext;
        var isAuthenticated = httpContext?.User?.Identity?.IsAuthenticated ?? false;

        if (isAuthenticated)
        {
            // The user is authenticated.
        }
    }
}

Если вы хотите применить политику авторизации, вы можете использовать IAuthorizationService. Вот полный пример этого:

public class Service
{
    private readonly IHttpContextAccessor httpContextAccessor;
    private readonly IAuthorizationService authzService;

    public Service(IHttpContextAccessor httpContextAccessor,
        IAuthorizationService authzService)
    {
        this.httpContextAccessor = httpContextAccessor;
        this.authzService = authzService;
    }

    public async Task ServiceFunction()
    {
        var httpContext = httpContextAccessor.HttpContext;
        var isAuthenticated = httpContext?.User?.Identity?.IsAuthenticated ?? false;

        if (isAuthenticated)
        {
            // The user is authenticated.

            var authzResult = await authzService.AuthorizeAsync(
                httpContext.User,
                "PolicyName");

            if (authzResult.Succeeded)
            {
                // The user is authorised.
            }
        }
    }
}

Примечание. Для использования IHttpContextAccessor может потребоваться добавить services.AddHttpContextAccessor(); в метод Startup.ConfigureServices.

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