作爲由評議
之一提到的「令牌使用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;
}
上述更改允許我在會話之間持續使用令牌。
令牌提供程序允許您創建重置令牌。您將不得不手動將其與相關用戶一起存儲。 – Nkosi
@Nkosi我能夠生成令牌並使用它,但是我需要在內存中查看已經生成的令牌以用於調試目的。我認爲它是自動化的,作爲庫的一部分,我不需要將它存儲在任何地方 – Ehsan
令牌提供程序不會將生成的代碼保存到內存中。 – Nkosi