更新:
根据
https://github.com/aspnet/Identity/blob/master/src/Identity/DataProtectionTokenProvider.cs
应该是
DataProtectorTokenProvider
给定代码
Protector = dataProtectionProvider.CreateProtector(Name ?? "DataProtectorTokenProvider")
如果创建了一个令牌,它需要被相同的令牌使用
应用程序池
!当在不同的应用程序池用户上测试代码时,代码没有通过,当应用程序池用户相同时,代码正常工作。
原件:
我没有找到欧文的名字,但我测试了我的安全问题。使用以下方法创建了两个Web应用程序。在webapplication1中创建用户时,我也从该值中复制了用户ID,即为webapplication2创建的用户,因此他们对该方法具有相同的guid ID。
manager.GeneratePasswordResetToken(identityUser.Id)
. 测试令牌时,仅适用于WebApplication1,而不适用于WebApplication2,即使用户具有相同的ID和
DpapiDataProtectionProvider
和
数据保护TortokenProvider
创建完全相同。
[HttpGet]
[AllowAnonymous]
[Route("testReset")]
public IHttpActionResult TestResetAdminDomain()
{
var db = new ApplicationDbContext();
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(db));
var provider = new DpapiDataProtectionProvider("ASP.NET Identity");
manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(
provider.Create("ASP.NET Identity"));
var email = "test@test.com";
var user = new ApplicationUser() { UserName = email, Email = email };
var identityUser = manager.FindByEmail(email);
if (identityUser == null)
{
manager.Create(user);
identityUser = manager.FindByEmail(email);
}
var token = manager.GeneratePasswordResetToken(identityUser.Id);
return Ok(HttpUtility.UrlEncode(token));
}
[HttpGet]
[AllowAnonymous]
[Route("testReset")]
public IHttpActionResult TestResetClientDomain(string token)
{
var db = new ApplicationDbContext();
var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(db));
var provider = new DpapiDataProtectionProvider("ASP.NET Identity");
manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(
provider.Create("ASP.NET Identity"));
var email = "test@test.com";
var identityUser = manager.FindByEmail(email);
var valid = Task.Run(() => manager.UserTokenProvider.ValidateAsync("ResetPassword", token, manager, identityUser)).Result;
var result = manager.ResetPassword(identityUser.Id, token, "TestingTest1!");
return Ok(result);
}