gpt4 book ai didi

c# - ASP.NET 身份电子邮件确认无效 token

转载 作者:行者123 更新时间:2023-11-30 12:57:51 24 4
gpt4 key购买 nike

我正在使用 Asp.Net Identity。当我想使用电子邮件确认 token 确认新用户时,我系统地遇到无效 token 错误。

这是我的 WebApi 用户 Controller :

public class UsersController : ApiController
{
private MyContext _db;
private MyUserManager _userManager;
private MyRoleManager _roleManager;


public UsersController()
{
_db = new MyContext();
_userManager = new MyUserManager(new UserStore<MyUser>(_db));
_roleManager = new MyRoleManager(new RoleStore<IdentityRole>(_db));
}

//New user method
[HttpPost]
public async Task<HttpResponseMessage> Register([FromBody]PostUserModel userModel)

{
//New user code
...

var token = await _userManager.GenerateEmailConfirmationTokenAsync(user.Id);
var message = new IdentityMessage();
message.Body = string.Format("Hi {0} !\r\nFollow this link to set your password : \r\nhttps://www.mywebsite.com/admin/users/{1}/reset?token={2}", user.UserName, user.Id, HttpUtility.UrlEncode(token));
message.Subject = "Confirm e-mail";
message.Destination = user.Email;
await _userManager.SendEmailAsync(user.Id, message.Subject, message.Body);

return Request.CreateResponse(HttpStatusCode.OK, res); }
}

为了确认电子邮件,我只是在做:

var result = await _userManager.ConfirmEmailAsync(user.Id, token);

我没有做 HttpUtility.UrlDecode 因为 WebApi 自己做。

还有我的自定义用户管理器类:

public class MyUserManager : UserManager<MyUser>
{
public MyUserManager(IUserStore<MyUser> store)
: base(store)
{
UserValidator = new UserValidator<MyUser>(this)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
};
// Configure user lockout defaults
UserLockoutEnabledByDefault = false;

EmailService = new EmailService();
SmsService = new SmsService();

var dataProtectionProvider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("MyApp");

UserTokenProvider = new Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider<MyUser>(dataProtectionProvider.Create("UserToken"));
}
}
}

有什么想法吗?非常感谢

最佳答案

我遇到了同样的问题,但我没有实现基于机器 key 的自定义提供程序就设法解决了这个问题。

我有 UserTokenProvider,它是在 UserManager 类中设置的,由 DI 根据请求范围连接。因此,对于每个请求,我都会创建新的 UserTokenProvider

当我检查源代码时,我注意到它在默认情况下在某处使用了 DpapiDataProtectionProvider。而DpapiDataProtectionProvider使用的构造函数是:

public DpapiDataProtectionProvider()
: this(Guid.NewGuid().ToString())
{
}

因此每次创建 DpapiDataProtectionProvider 时,它都会生成一个新的 GUID,用作应用名称。

有两种解决方案:

  1. 将其连接为单例。
  2. 让它使用一些固定的应用名称。

我决定使用第二个,因为单例解决方案会在应用程序池回收等方面再次中断。

现在我的 DI 注册(使用 Simple Injector)看起来像这样(仍然使用 per-request scope,尽管它可能不是必需的):

container.Register<IUserTokenProvider<ApplicationUser, string>>(() =>
new DataProtectorTokenProvider<ApplicationUser>
(new DpapiDataProtectionProvider("MY APPLICATION NAME").Create("ASP.NET Identity"))
{
// all user tokens are only valid for 3 hours
TokenLifespan = TimeSpan.FromHours(3)
}, Lifestyle.Scoped);

希望这对某人有帮助。

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

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