Asp.net 无法识别身份电子邮件验证令牌

Asp.net Identity Email Verifcation Token Not Recognized

我们在 Web 表单应用程序中使用 Microsoft 的身份框架 v2.0。一切正常。我们决定将电子邮件验证添加为新帐户设置过程的一部分。如果我们在同一页面中创建令牌后对其进行验证,那么我们就成功了。但是,如果我们尝试在不同的页面中验证令牌,则会失败。过程很简单:

  1. 管理员通过提供用户的电子邮件和姓名创建一个新帐户。 (我们不支持自助注册)。
  2. 用户单击 link 他收到电子邮件以验证已收到电子邮件。

这是创建电子邮件验证令牌的代码:

var manager = new UserManager();
var user = new ApplicationUser() { UserName = EmailAddress.Text, Email = EmailAddress.Text, FirstName = FirstName.Text, LastName = LastName.Text };
IdentityResult result = manager.Create(user);
var provider = new DpapiDataProtectionProvider();
manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("EmailConfirmation"))
{
    TokenLifespan = TimeSpan.FromHours(24)
};
var strToken = manager.GenerateEmailConfirmationToken(user.Id);
//IdentityResult validToken = manager.ConfirmEmail(user.Id, strToken);
strToken = HttpUtility.UrlEncode(strToken.ToString());

注意:如果我们取消注释以 //IdentityResult validToken... 开头的行,那么它就会成功。

这是 VerifyEmail 页面上的代码:

string userid = Request.QueryString["id"].ToString();
string tokenReceived = Request.QueryString["token"].ToString();
//tokenReceived = HttpUtility.UrlDecode(tokenReceived);
ApplicationUser User = new ApplicationUser();
var manager = new UserManager();
User = manager.FindById(userid);
var provider = new DpapiDataProtectionProvider();
manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("EmailConfirmation"))
{
    TokenLifespan = TimeSpan.FromHours(24)
};

IdentityResult validToken = manager.ConfirmEmail(User.Id, tokenReceived);

此文件中的 validToken 行不成功。我已验证两个文件中的字符串 User.Id 和 tokenReceived 完全匹配,因此不会发生 URL 损坏。 (这就是我注释掉 UrlDecode 的原因,因为它似乎由浏览器自动解码 - 当我尝试解码时,它与编码前的字符串不是 100% 相同)。

所以我确定我们正在调用相同的方法(ConfirmEmail)并且传递的两个参数是完全相同的字符串。我也知道令牌只能验证一次,所以我不会在验证后尝试重新使用它们。

欢迎提出任何想法。

我认为 DpapiDataProtectionProvider 中的问题 - 如果您在创建和验证令牌时使用此 class 的相同实例,它将正常工作。

您没有按照 VC2013 模板从 Owin 上下文中获取 UserManager 的任何原因?