【发布时间】:2024-01-19 07:25:01
【问题描述】:
我有一个计划的 WebJob,它每天运行并检查我数据库中所有用户的密码到期日期。如果密码到期日是今天,它将生成一个密码重置令牌并通过电子邮件发送给用户。然后用户点击电子邮件中的 url 并被带到一个网站,在那里他们输入新密码。
我设法在我的 WebJob 中生成了一个令牌并通过电子邮件发送它。但是,当通过我的 Asp.NET 网站重置密码时,我得到 Invalid Token。我不知道为什么。我认为它一定与我的 WebJob 中的令牌提供者有关。
1) 我的 Asp.NET 网站。自定义 UserManager:
public class CustomUserManager : UserManager<ApplicationUser> {
public CustomUserManager(IUserStore<ApplicationUser> store) : base(store) { }
public static CustomUserManager Create(IdentityFactoryOptions<CustomUserManager> options, IOwinContext context) {
var db = context.Get<DataContext>();
var manager = new CustomUserManager(new UserStore<ApplicationUser>(db));
// [...]
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null) {
manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
}
// [...]
return manager;
}
}
这样使用:
userManager = HttpContext.GetOwinContext().Get<CustomUserManager>();
// [...]
await userManager.ResetPasswordAsync(model.Id, model.Token, model.ConfirmPassword); // token here is invalid (although the string looks like a proper token)
2) 我的WebJob功能:
public static async void CheckPasswords([QueueTrigger("checkpasswords")] string message) {
using (var db = new DataContext())
using (var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db))) {
var provider = new DpapiDataProtectionProvider("MyApp");
userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("PasswordReset"));
var users = await queryHandler.Run(new UserPasswordExpiryQuery());
foreach (var user in users) {
var days = new DateCalculations().DaysFromNow(user.PasswordExpiryDate);
// if password expired today
if (days == 0) {
var token = await userManager.GeneratePasswordResetTokenAsync(user.Id);
var url = string.Format("{0}/resetpass?user={1}&token={2}", settings.BaseUrl, user.Id, HttpUtility.UrlEncode(token));
// [...] send email logic here
}
}
}
}
稍后编辑
我想我可能已经想通了。我在我的 Asp.NET 应用程序中替换了令牌提供程序:
旧代码:
var dataProtectionProvider = options.DataProtectionProvider;
if (dataProtectionProvider != null) {
manager.UserTokenProvider =
new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity"));
}
新代码:
var provider = new DpapiDataProtectionProvider("MyApp");
manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("ASP.NET Identity"));
稍后会做一些进一步的测试。
【问题讨论】:
标签: c# asp.net asp.net-identity azure-web-app-service azure-webjobs