是否有可能仅使用用户对象返回access_token?

时间:2017-08-21 17:59:37

标签: .net-core identityserver4

我正在实现一个功能,其中access_token将通过电子邮件发送,在这种情况下,我需要使用逻辑生成此令牌,以便在访问通过电子邮件传递的链接时对用户进行身份验证。

public async Task<IActionResult> GetLink () 
{
    var user = await userManager.FindByEmailAsync("eduardo@test.com.br"); // is active user created
    if (user != null)
    {
        var ident = await userManager.GetAuthenticationTokenAsync(user, "Test", "access_token");
        return Ok(ident);
    }
    return NoContent();
}

基于预期的研​​究会是这样的,但这不是用持久数据完成的,我的模型不允许这样,任何人都知道如何坚持?或者甚至只是返回令牌?

我认为这是一种不好的行为并不是不可接受的,但是,在这种情况下我的用户没有访问密码,可能需要使用令牌或其他模式登录。 这是一个非常简单的流程,这个链接将是一个授权操作(基本上只有读取访问权限),此链接将仅通过电子邮件发送给用户。

1 个答案:

答案 0 :(得分:1)

上述问题可以解决如下:

[HttpGet("get_token")]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(string))]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> GetUserToken([FromServices] ITokenService TS, [FromServices] IUserClaimsPrincipalFactory<EkyteUser> principalFactory,
[FromServices] IdentityServerOptions options)
{           
    var Request = new TokenCreationRequest();                        
    var user = await userManager.FindByIdAsync(User.GetSubjectId());
    var IdentityPricipal = await principalFactory.CreateAsync(user);
    var IdServerPrincipal = IdentityServerPrincipal.Create(user.Id.ToString(), user.UserName);

    Request.Subject = IdServerPrincipal;
    Request.IncludeAllIdentityClaims = true;
    Request.ValidatedRequest = new ValidatedRequest();
    Request.ValidatedRequest.Subject = Request.Subject;
    Request.ValidatedRequest.SetClient(Config.GetClient());
    Request.Resources = new Resources(Config.GetResources(), Config.GetApiResources());
    Request.ValidatedRequest.Options = options;            
    var Token = await TS.CreateAccessTokenAsync(Request);
    Token.Issuer = "http://" + HttpContext.Request.Host.Value;

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

有必要识别用户,设置必要的资源,从而设置正在访问的客户端。之后,只需包含访问主机即可生成令牌。