有没有可能 return access_token 只有用户对象?
Is there any possibility return the access_token with only user object?
我正在实现一个功能,其中 access_token 将通过电子邮件发送,在这种情况下,我需要生成此令牌,并在访问通过电子邮件传递的 link 时对用户进行身份验证.
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();
}
根据研究,预计会是这样的,但这不是用持久化数据完成的,我的模型也不允许这样做,有人知道如何持久化吗?或者甚至只是 return 令牌?
我认为这是不可接受的不良行为,但是,在这种情况下,我的用户没有访问密码,可能需要使用令牌或其他方式登录。
这是一个非常简单的流程,这个 link 将是一个授予操作的流程(它基本上只有读取权限),并且这个 link 将仅通过电子邮件发送给用户。
以上问题可以按如下方式解决:
[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);
}
有必要识别用户,设置必要的资源,从而设置正在访问的客户端。之后,只需包含访问主机即可生成令牌。
我正在实现一个功能,其中 access_token 将通过电子邮件发送,在这种情况下,我需要生成此令牌,并在访问通过电子邮件传递的 link 时对用户进行身份验证.
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();
}
根据研究,预计会是这样的,但这不是用持久化数据完成的,我的模型也不允许这样做,有人知道如何持久化吗?或者甚至只是 return 令牌?
我认为这是不可接受的不良行为,但是,在这种情况下,我的用户没有访问密码,可能需要使用令牌或其他方式登录。 这是一个非常简单的流程,这个 link 将是一个授予操作的流程(它基本上只有读取权限),并且这个 link 将仅通过电子邮件发送给用户。
以上问题可以按如下方式解决:
[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);
}
有必要识别用户,设置必要的资源,从而设置正在访问的客户端。之后,只需包含访问主机即可生成令牌。