加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-core – 使用IdentityServer4生成访问令牌,无需密码

发布时间:2020-12-15 20:38:07 所属栏目:asp.Net 来源:网络整理
导读:我使用ROPC流创建了使用IdentityServer4保护的ASP.NET Core WebApi(使用此示例: https://github.com/robisim74/AngularSPAWebAPI). 如何在没有密码的情况下从服务器手动生成access_token? 解决方法 [HttpPost("loginas/{id}")][Authorize(Roles = "admin")
我使用ROPC流创建了使用IdentityServer4保护的ASP.NET Core WebApi(使用此示例: https://github.com/robisim74/AngularSPAWebAPI).

如何在没有密码的情况下从服务器手动生成access_token?

解决方法

[HttpPost("loginas/{id}")]
[Authorize(Roles = "admin")]
public async Task<IActionResult> LoginAs(int id,[FromServices] ITokenService TS,[FromServices] IUserClaimsPrincipalFactory<ApplicationUser> principalFactory,[FromServices] IdentityServerOptions options)
{
    var Request = new TokenCreationRequest();                        
    var User = await userManager.FindByIdAsync(id.ToString());
    var IdentityPricipal = await principalFactory.CreateAsync(User);
    var IdServerPrincipal = IdentityServerPrincipal.Create(User.Id.ToString(),User.UserName,IdentityPricipal.Claims.ToArray());

    Request.Subject = IdServerPrincipal;
    Request.IncludeAllIdentityClaims = true;
    Request.ValidatedRequest = new ValidatedRequest();
    Request.ValidatedRequest.Subject = Request.Subject;
    Request.ValidatedRequest.SetClient(Config.GetClients().First());
    Request.Resources = new Resources(Config.GetIdentityResources(),Config.GetApiResources());
    Request.ValidatedRequest.Options = options;
    Request.ValidatedRequest.ClientClaims = IdServerPrincipal.Claims.ToArray();

    var Token = await TS.CreateAccessTokenAsync(Request);
    Token.Issuer = "http://" + HttpContext.Request.Host.Value;

    var TokenValue = await TS.CreateSecurityTokenAsync(Token);
    return Ok(TokenValue);
}

对于新发布的IdentityServer 2.0.0,代码需要进行一些修改:

[HttpPost("loginas/{id}")]
    [Authorize(Roles = "admin")]
    public async Task<IActionResult> LoginAs(int id,[FromServices] IdentityServerOptions options)
    {
        var Request = new TokenCreationRequest();
        var User = await userManager.FindByIdAsync(id.ToString());
        var IdentityPricipal = await principalFactory.CreateAsync(User);
        var IdentityUser = new IdentityServerUser(User.Id.ToString());
        IdentityUser.AdditionalClaims = IdentityPricipal.Claims.ToArray();
        IdentityUser.DisplayName = User.UserName;
        IdentityUser.AuthenticationTime = System.DateTime.UtcNow;
        IdentityUser.IdentityProvider = IdentityServerConstants.LocalIdentityProvider;
        Request.Subject = IdentityUser.CreatePrincipal();
        Request.IncludeAllIdentityClaims = true;
        Request.ValidatedRequest = new ValidatedRequest();
        Request.ValidatedRequest.Subject = Request.Subject;
        Request.ValidatedRequest.SetClient(Config.GetClients().First());
        Request.Resources = new Resources(Config.GetIdentityResources(),Config.GetApiResources());
        Request.ValidatedRequest.Options = options;
        Request.ValidatedRequest.ClientClaims = IdentityUser.AdditionalClaims;
        var Token = await TS.CreateAccessTokenAsync(Request);
        Token.Issuer = HttpContext.Request.Scheme + "://" + HttpContext.Request.Host.Value;
        var TokenValue = await TS.CreateSecurityTokenAsync(Token);
        return Ok(TokenValue);
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读