gpt4 book ai didi

c# - ASP.NET 身份电子邮件验证 token 始终无效

转载 作者:太空宇宙 更新时间:2023-11-03 10:34:32 27 4
gpt4 key购买 nike

我正在尝试实现一个邀请系统,新创建的帐户使用 UserManager.GenerateEmailConfirmationToken 通过电子邮件收到确认 token 。和 UserManager.ConfirmEmail .然而,ConfirmEmail 方法总是返回 false。

根据 this 中的建议发布我实现我的 MachineKeyDataProtector 并像这样在 Unity 中注册:

container.RegisterType<IUserTokenProvider<User, Guid>, 
DataProtectorTokenProvider<User, Guid>>(new InjectionConstructor(new MachineKeyDataProtector("ASP.NET Identity")));

我的 UserManager 是这样注入(inject) IUserTokenProvider 的:

public UserManager(IUserStore<User, Guid> store, IUserTokenProvider<User, Guid> userTokenProvider)
: base(store)
{
// Configure validation logic for passwords
this.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = false,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};

this.UserTokenProvider = userTokenProvider;
}

然后我将 GenerateEmailConfirmationToken 方法封装在扩展方法中:

public static string GenerateUrlForEmailConfirmationToken(this UserManager<User, Guid> userManager, UrlHelper urlHelper, Guid userId)
{
var verificationCode = userManager.GenerateEmailConfirmationToken(userId);

var url = urlHelper.Link(string.Empty, new
{
controller = "Account",
action = "Verify",
userId = userId,
verificationCode = verificationCode
});

return url;
}

我正在使用它:

var url = UserManager.GenerateUrlForEmailConfirmationToken(Url, targetUser.Id);
//injects the url in a ready made html template
NotificationService.NotifyNewUser(targetUser, url);

调试 GenerateUrlForEmailConfirmationToken 我看到正在调用 MachineKeyDataProtector 的保护方法,但是 MachineKeyDataProtector 的取消保护从未被 UserManager 的 ConfirmEmail 调用。

如果我更改 DI 配置以根据请求注册 IUserTokenProvider

container.RegisterType<IUserTokenProvider<User, Guid>, 
DataProtectorTokenProvider<User, Guid>>(new PerRequestLifetimeManager(),
new InjectionConstructor(new MachineKeyDataProtector("ASP.NET Identity")));

然后 MachineKeyDataProtector 的 unprotect 被调用,但它抛出 CryptographicException 并显示以下消息“加密操作期间发生错误。”。

难道这就是验证总是错误的原因吗?如果是这样,如何确保调用 unprotect 方法?通过查看两种情况下的对象,UserManager 似乎使用了正确的 IDataProtector。

感谢任何帮助!

最佳答案

我遇到了与您在示例 SO 帖子中提到的相同类型的问题。我已经使用它如下。在这种情况下,我使用 SimpleInjector IOC 为每个 Web 请求注册 Usermanager

我认为如果任何 dataProtectionProvider 不存在,您只需要创建新的 DataProtectorTokenProvider。此外,在 UserManager 构造函数中创建 DataProtectorTokenProvider 将解决此问题。

private static void InitializeUserManager(ApplicationUserManager manager, IAppBuilder app)
{
manager.UserValidator = new UserValidator<AspNetApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};

// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = false,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};

var dataProtectionProvider = app.GetDataProtectionProvider();

if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider<AspNetApplicationUser>(
dataProtectionProvider.Create("ASP.NET Identity"))
{
TokenLifespan = TimeSpan.FromHours(3)
};
}
}

我添加了 token 生命周期,但如果不需要,您可以将其删除。

关于c# - ASP.NET 身份电子邮件验证 token 始终无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28394110/

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