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

时间:2015-01-22 18:26:22

标签: asp.net forms asp.net-identity email-verification

我们在Web表单应用程序中使用Microsoft的Identity Framework v2.0。一切都运作良好。我们决定在新帐户设置流程中添加电子邮件验证功能。如果我们在同一页面中创建令牌后验证令牌,我们就会成功。但是如果我们尝试在不同的页面中验证令牌,它就会失败。这个过程非常简单:

  1. 管理员通过提供用户的电子邮件和姓名来创建新帐户。 (我们不支持自我注册)。
  2. 用户点击他在电子邮件中收到的链接,以验证收到的电子邮件。
  3. 以下是创建电子邮件验证令牌的代码:

    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),并且传递的两个参数完全相同。我也知道一个令牌只能被验证一次,所以我不会在验证它们之后重新使用它们。

    欢迎任何想法。

1 个答案:

答案 0 :(得分:2)

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

根据VC2013模板,您没有从Owin Context获得UserManager的任何原因?