gpt4 book ai didi

asp.net - 如何撤销/无效/取消旧的电子邮件确认 token (身份)

转载 作者:行者123 更新时间:2023-12-01 23:16:42 24 4
gpt4 key购买 nike

我允许新创建的知道密码但尚未确认的用户更改他们的注册电子邮件(只要它没有在我的数据库中注册)

问题是,如果他们更改了电子邮件,我会生成新的电子邮件确认 token ,但旧 token 仍然可以验证它们(我在注册时发出的 token ),这很可能意味着人们可以首先使用他们的注册邮件,请更改将它发送到他们无法访问的其他邮件,并从旧邮件进行验证,这是一个很大的安全漏洞,让我离开

有没有办法删除/撤销旧 token ? (从技术上讲,我可以创建一个新用户并删除旧用户,旧 token 不适用于新用户,但我认为应该有更好的解决方案)

最佳答案

我在 ApplicationUser 中添加了以下属性类(class)

public class ApplicationUser : IdentityUser {
public string EmailConfirmationToken { get; set; }
public string ResetPasswordToken { get; set; }
}

这保留了确认电子邮件 token 时要验证的确认 token 。

然后我将以下内容添加到我的 ApplicationUserManager这是一个 UserManager<ApplicationUser>派生类。
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);
if (!string.IsNullOrEmpty(token)) {
var user = await FindByIdAsync(userId);
user.EmailConfirmationToken = token;
user.EmailConfirmed = false;
await UpdateAsync(user);
}
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;
}

添加了以下扩展,以便能够根据用户存储的 token 找到用户。
public static class ApplicationUserManagerExtension {
public static Task<string> FindIdByEmailConfirmationTokenAsync(this UserManager<ApplicationUser> manager, string confirmationToken) {
string result = null;

ApplicationUser user = manager.Users.SingleOrDefault(u => u.EmailConfirmationToken != null && u.EmailConfirmationToken == confirmationToken);

if (user != null) {
result = user.Id;
}

return Task.FromResult(result);
}

public static Task<string> FindIdByResetPasswordTokenAsync(this UserManager<ApplicationUser> manager, string token) {
string result = null;

ApplicationUser user = manager.Users.SingleOrDefault(u => u.ResetPasswordToken != null && u.ResetPasswordToken == token);

if (user != null) {
result = user.Id;
}

return Task.FromResult(result);
}
}

关于asp.net - 如何撤销/无效/取消旧的电子邮件确认 token (身份),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44243398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com