IdentityServer4 Отклонить запрос токена, если пользовательский параметр недействителен - PullRequest
0 голосов
/ 15 марта 2020

У меня есть этот тестовый клиент, отправляющий RequestToken:

var tokenResponse = await client.RequestTokenAsync(new TokenRequest
            {
                Address = disco.TokenEndpoint,
                GrantType = "password",
                ClientId = "My_Client",
                ClientSecret = "mysecret",
                Parameters =
                {
                    { "username", "user@entity.com" },
                    { "password", "userpassword" },
                    { "logged_entity_id", "143" },
                    { "scope", "MyAPI" }
                }
            });

Теперь у каждого пользователя есть список сущностей, и я хочу отклонить запрос токена, если значение в параметре "logged_entity_id" не существует в список сущностей пользователя.

Сначала я планировал проверить его с помощью IsActiveSyn c в моем CustomProfileService, но у меня не получается получить доступ к необработанным параметрам в методе IsActiveSyn c.

    public class CustomProfileService : IProfileService
    {
        protected UserManager<User> _userManager;

        public CustomProfileService(UserManager<User> userManager)
        {
            _userManager = userManager;
        }

        public Task GetProfileDataAsync(ProfileDataRequestContext context)
        {
            var claims = new List<Claim>
            {
                new Claim("LoggedEntityId", context.ValidatedRequest.Raw["logged_entity_id"])
            };

            context.IssuedClaims.AddRange(claims);

            return Task.FromResult(0);
        }

        public Task IsActiveAsync(IsActiveContext context)
        {
            var user = _userManager.GetUserAsync(context.Subject).Result;
            // var entityId = Can't access logged_entity_id parameter here

            context.IsActive = user != null && user.DeletingDate == null && user.entities.Contains(entityId);
            return Task.FromResult(0);
        }
    }

Я не совсем уверен, должен ли я проверить и отклонить это.

Ответы [ 2 ]

1 голос
/ 16 марта 2020

В ядре asp. net вы можете зарегистрировать зависимость с помощью встроенного контейнера внедрения зависимостей. Контейнер внедрения зависимостей предоставляет IHttpContextAccessor для любых классов, которые объявляют его как зависимость в своих конструкторах:

public void ConfigureServices(IServiceCollection services)
{
     ...
     services.AddHttpContextAccessor();
     ...
}

Затем в вашем классе, например, в реализации IProfileService:

private readonly IHttpContextAccessor _httpContextAccessor;

public CustomProfileService(IHttpContextAccessor httpContextAccessor)
{ 
     _httpContextAccessor = httpContextAccessor;
}

Затем в методе IsActiveAsyn c получить значение по:

var  id = _httpContextAccessor.HttpContext.Request.Form["logged_entity_id"].ToString();
0 голосов
/ 16 марта 2020

Вы можете реализовать ICustomTokenValidator для проверки запроса токена по-своему

Пользовательский код можно запустить как часть конвейера выдачи токена в конечной точке токена. Это позволяет, например, для

добавить дополнительные логи проверки c

, изменяя определенные параметры (например, время жизни токена) динамически

public class CustomValidator : ICustomTokenRequestValidator 
{
    public Task<TokenValidationResult> ValidateAccessTokenAsync(TokenValidationResult result)
    {
        throw new NotImplementedException();
    }

    public Task<TokenValidationResult> ValidateIdentityTokenAsync(TokenValidationResult result)
    {
        throw new NotImplementedException();
    }
}

и в вашем файле startup.cs:

services.AddIdentityServer(options =>
{
  ...
})
.AddCustomTokenRequestValidator<CustomValidator>();
...