使用 IdentityServer3 生成访问令牌,无需密码
Posted
技术标签:
【中文标题】使用 IdentityServer3 生成访问令牌,无需密码【英文标题】:Generate access token with IdentityServer3 without password 【发布时间】:2019-03-03 09:59:49 【问题描述】:如何在没有密码的情况下从服务器手动生成 access_token? 我想让超级管理员以用户身份登录并查看他们的问题并通过他们的眼睛看到问题,所以我需要用户 access_token。我已经看到了这个question,但在 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 非常相似
【讨论】:
以上是关于使用 IdentityServer3 生成访问令牌,无需密码的主要内容,如果未能解决你的问题,请参考以下文章
使用 IdentityServer4.AccessTokenValidation 包向 IdentityServer3 授权 .NET 5 Web API 引用令牌时遇到问题