Аутентификация токена доступа Okta не заполняет пользовательские свойства объекта AuthorizationHandlerContext - PullRequest
0 голосов
/ 16 апреля 2019

Я создаю ASP.NET Core Web API с аутентификацией по токену доступа Okta.Я реализовал аутентификацию токена доступа okta на основе этой статьи: https://developer.okta.com/blog/2018/02/01/secure-aspnetcore-webapi-token-auth

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

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

Причина этого заключается в том, что я хотел бы запросить базу данных для пользователя, который пытается использовать API, если у него есть соответствующие разрешения на использование ресурса.

Сценарий заключается в следующем: база данных хранит некоторые группы и пользователей, и пользователи имеют роли для каждой из групп.Разрешения не являются статичными, они специфичны для каждого объекта, например, для некоторых групп он имеет права администратора, для других он имеет только права участника.Поэтому вызов базы данных является обязательным перед каждым вызовом API.

Моя проблема заключается в том, что после того, как аутентификация токена прошла успешно, и программа достигает AuthorizationHandler, я не могу прочитать информацию пользователя из объекта AuthorizationHandlerContext, потому что егоСвойство пользователя не содержит ничего, кроме ответов от сервера okta.

Это соответствующий сегмент из файла Startup.cs:

    services.AddAuthentication(options =>
        {
            options.DefaultChallengeScheme = OktaDefaults.ApiAuthenticationScheme;
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(options =>
        {
            options.Authority = Configuration["Authority"];
            options.Audience = Configuration["Audience"];
            options.RequireHttpsMetadata = false;
            options.IncludeErrorDetails = true;

        });

Пользователь входит в систему:

public async Task<SignInResult> Login(LoginUserDTO loginUser)
    {
        var user = _db.Users.FirstOrDefault(u => u.Email.Equals(loginUser.Email));
        if (user == null)
        {
            return SignInResult.Failed;
        }

        return await _signInManager.PasswordSignInAsync(user, loginUser.Password, true, false);
    }

И после этого, если вход был успешным, он получает новый токен:

[Route("login")]
    [HttpPost]
    public async Task<IActionResult> Login([FromBody] LoginUserDTO loginUser)
    {
        var result = await _accountService.Login(loginUser);

        if (result.Succeeded)
        {
            var tokenResult = await _accountService.GetToken(loginUser);
            if (tokenResult == null)
            {
                return ValidationProblem(new ValidationProblemDetails(){Detail = "Failed to create access token" });
            }

            return Ok(tokenResult);
        }

        return BadRequest(IdentityResult.Failed());
    }

Должен ли я добавить дополнительную логику в сегмент входа?Или я ошибаюсь, и вся логика проверки токена должна быть разработана по-другому?

...