Создать токен доступа с IdentityServer3 без пароля - PullRequest
0 голосов
/ 03 марта 2019

Как вручную сгенерировать access_token с сервера без пароля?Я хочу разрешить супер-администраторам входить в систему как пользователи, просматривать их проблемы и видеть проблемы их глазами, поэтому мне нужен пользователь access_token.я уже вижу этот вопрос , но он мне не помог в IdentityServer3.

1 Ответ

0 голосов
/ 29 июля 2019

сначала создайте пользовательский грант с именем loginBy

    public class LoginByGrant : ICustomGrantValidator
    {
        private readonly ApplicationUserManager _userManager;

        public string GrantType => "loginBy";

        public LoginByGrant(ApplicationUserManager userManager)
        {
            _userManager = userManager;
        }     

        public async Task<CustomGrantValidationResult> ValidateAsync(ValidatedTokenRequest request)
        {

            var userId = Guid.Parse(request.Raw.Get("user_id"));

            var user = await _userManager.FindByIdAsync(userId);

            if (user == null)
                return await Task.FromResult<CustomGrantValidationResult>(new CustomGrantValidationResult("user not exist"));

            var userClaims = await _userManager.GetClaimsAsync(user.Id);

            return
                await Task.FromResult<CustomGrantValidationResult>(new CustomGrantValidationResult(user.Id.ToString(), "custom", userClaims));

        }
    }

, затем добавьте этот пользовательский грант в класс запуска идентификации

    factory.CustomGrantValidators.Add(
                        new Registration<ICustomGrantValidator>(resolver => new LoginByGrant(ApplicaionUserManager)));

и, наконец, в свой API

      public async Task<IHttpActionResult> LoginBy(Guid userId)
       {
        var tokenClient = new TokenClient(Constants.TokenEndPoint, Constants.ClientId, Constants.Secret);

        var payload = new { user_id = userId.ToString() };

        var result = await tokenClient.RequestCustomGrantAsync("loginBy", "customScope", payload);

        if (result.IsError)
            return Ok(result.Json);

        return Ok(new { access_token = result.AccessToken, expires_in = result.ExpiresIn});
       }

это для identityServer3, но для identityServer4 оно очень похоже

...