【发布时间】:2014-11-01 07:56:30
【问题描述】:
所以 UserManager 有一个名为 GenerateUserTokenAsync(string purpose, TKey userId) 的函数。
这在 ASP Identity 中有什么作用?我可以使用它来生成 OAuth Bearer 令牌吗?还有目的参数是什么?这可以是什么值?
【问题讨论】:
标签: asp.net asp.net-web-api asp.net-identity
所以 UserManager 有一个名为 GenerateUserTokenAsync(string purpose, TKey userId) 的函数。
这在 ASP Identity 中有什么作用?我可以使用它来生成 OAuth Bearer 令牌吗?还有目的参数是什么?这可以是什么值?
【问题讨论】:
标签: asp.net asp.net-web-api asp.net-identity
UserManager.GenerateUserTokenAsync(User, TokenProvider, Purpose)
可用于为用户管理器未实现的目的生成令牌。
一个例子是邀请系统。在 WebProject 中,您需要像这样创建一个 TokenProvider:
public class InvitationTokenProvider<TUser> : DataProtectorTokenProvider<TUser> where TUser : class
{
public InvitationTokenProvider(IDataProtectionProvider dataProtectionProvider, IOptions<InvitationTokenProviderOptions> options, ILogger<DataProtectorTokenProvider<TUser>> logger) : base(dataProtectionProvider, options, logger)
{
}
}
和 InvitationTokenProviderOptions
public class InvitationTokenProviderOptions : DataProtectionTokenProviderOptions
{
}
然后你可以在StartUp.ConfigureServices()注册。
services.AddIdentity<User, Role>(options =>
{
// ...
}).AddEntityFrameworkStores<ApplicationDbContect>()
.AddDefaultTokenProviders()
.AddTokenProvider<InvitationTokenProvider<User>>("Invitation");
之后您可以像这样将它与 UserManger 一起使用
// create a token
string token = await _userManager.GenerateUserTokenAsync(user, "Invitation", "Invitation");
// verify it
bool result = await _userManager.VerifyUserTokenAsync(user, "Invitation", "Invitation", token);
如果您要在 URL 中使用令牌,请不要忘记将其设为 URL-Safe(它可能包含“/”和其他符号。 还要检查尾随的“==”是否在通过电子邮件和浏览器的过程中丢失。
【讨论】:
cs var invitationToken = await _userManager.GenerateUserTokenAsync(user, "invitation", "invitation"); var _invitationToken = HttpUtility.UrlEncode(invitationToken); //verify var authorized = await _userManager.VerifyUserTokenAsync(dbUser,"invitation","invitation", HttpUtility.UrlDecode(invitationToken));
“GenerateUserTokenAsync”的文档说
为特定目的获取用户令牌
这种方法不应该直接使用,(不知道为什么它是公开的)。它用于生成密码重置令牌 (GeneratePasswordResetTokenAsync) 和电子邮件确认令牌 (GenerateEmailConfirmationTokenAsync)。它是这样使用的:
GenerateUserTokenAsync("Confirmation", userId); // email confirmation
GenerateUserTokenAsync("ResetPassword", userId); // password reset
在令牌提供程序 (TotpSecurityStampBasedTokenProvider) 的默认实现中,目的是用作加密令牌生成中的某种密码。
总的来说,你不需要使用GenerateUserTokenAsync,只需调用GeneratePasswordResetTokenAsync或GenerateEmailConfirmationTokenAsync即可。
【讨论】: