【问题标题】:Generate access token with IdentityServer3 without password使用 IdentityServer3 生成访问令牌,无需密码
【发布时间】:2019-03-03 09:59:49
【问题描述】:

如何在没有密码的情况下从服务器手动生成 access_token? 我想让超级管理员以用户身份登录并查看他们的问题并通过他们的眼睛看到问题,所以我需要用户 access_token。我已经看到了这个question,但在 IdentityServer3 中没有帮助我。

【问题讨论】:

    标签: c# asp.net asp.net-web-api identityserver3


    【解决方案1】:

    首先创建一个名为 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 非常相似

    【讨论】:

      猜你喜欢
      • 2017-10-25
      • 2019-08-06
      • 2019-12-25
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      • 2012-07-09
      • 2020-08-11
      相关资源
      最近更新 更多