我们在Web表单应用程序中使用Microsoft的Identity Framework v2.0。一切都运作良好。我们决定在新帐户设置流程中添加电子邮件验证功能。如果我们在同一页面中创建令牌后验证令牌,我们就会成功。但是如果我们尝试在不同的页面中验证令牌,它就会失败。这个过程非常简单:
以下是创建电子邮件验证令牌的代码:
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),并且传递的两个参数完全相同。我也知道一个令牌只能被验证一次,所以我不会在验证它们之后重新使用它们。
欢迎任何想法。
答案 0 :(得分:2)
我认为DpapiDataProtectionProvider
中的问题 - 如果您在创建和验证令牌时使用此类的相同实例,它将正常工作。
根据VC2013模板,您没有从Owin Context获得UserManager
的任何原因?