有没有办法在 ASP.NET Identity 2 中看到生成的密码重置令牌?
我的假设是TokenProvider
中应该有一个字典,它将这些令牌保存在内存中。
更新:
这是一个类似的问题ResetPassword Token How and where is it stored?
"使用SecurityStamp生成令牌并进行验证 SecurityStamp并且不存储在数据库或本地文件中的任何位置 。存储"
但问题仍然是框架如何知道令牌何时过期而不存储它?
答案 0 :(得分:3)
令牌不存储在内存中,而是由给定的 SecurityStamp 动态生成。令牌基本上是一个Unicode编码的字符串。
您可以看到UserManager.cs的 CreateSecurityTokenAsync 方法。
internal async Task<byte[]> CreateSecurityTokenAsync(TUser user)
{
return Encoding.Unicode.GetBytes(await GetSecurityStampAsync(user));
}
答案 1 :(得分:1)
如其中一位评论者所述
“使用SecurityStamp生成令牌并根据SecurityStamp进行验证,而不是存储在数据库或本地文件存储中的任何位置。”
引自ResetPassword Token How and where is it stored?
以下是我能够持久保存令牌供以后使用的方法。
我假设您使用的是默认项目模板。
在ApplicationUser
中创建存储令牌的属性。
public class ApplicationUser : IdentityUser {
public string EmailConfirmationToken { get; set; }
public string ResetPasswordToken { get; set; }
}
在AspNetUsers
表中创建相应的列。
然后我按如下方式更新了ApplicationUserManager
类。
public override async System.Threading.Tasks.Task<string> GenerateEmailConfirmationTokenAsync(string userId) {
/* NOTE:
* The default UserTokenProvider generates tokens based on the users's SecurityStamp,
* so until that changes(like when the user's password changes), the tokens will always be the same, and remain valid.
* So if you want to simply invalidate old tokens, just call manager.UpdateSecurityStampAsync().
*/
//await base.UpdateSecurityStampAsync(userId);
var token = await base.GenerateEmailConfirmationTokenAsync(userId);
//associate the email token with the user account
if (!string.IsNullOrEmpty(token)) {
var x = await FindByIdAsync(userId);
x.EmailConfirmationToken = token;
x.EmailConfirmed = false;
await UpdateAsync(x);
}
return token;
}
public override async System.Threading.Tasks.Task<string> GeneratePasswordResetTokenAsync(string userId) {
var token = await base.GeneratePasswordResetTokenAsync(userId);
if (!string.IsNullOrEmpty(token)) {
var x = await FindByIdAsync(userId);
x.ResetPasswordToken = token;
await UpdateAsync(x);
}
return token;
}
public override async System.Threading.Tasks.Task<IdentityResult> ConfirmEmailAsync(string userId, string token) {
var result = await base.ConfirmEmailAsync(userId, token);
if (result.Succeeded) {
var x = await FindByIdAsync(userId);
x.EmailConfirmationToken = null;
await UpdateAsync(x);
}
return result;
}
public override async System.Threading.Tasks.Task<IdentityResult> ResetPasswordAsync(string userId, string token, string newPassword) {
var result = await base.ResetPasswordAsync(userId, token, newPassword);
if (result.Succeeded) {
var x = await FindByIdAsync(userId);
x.ResetPasswordToken = null;
await UpdateAsync(x);
}
return result;
}
上述更改使我可以在会话之间保留令牌。