代码之家  ›  专栏  ›  技术社区  ›  Denis Burke

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

  •  2
  • Denis Burke  · 技术社区  · 11 年前

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

    1. 管理员通过提供用户的电子邮件和姓名创建新帐户。(我们不支持自行注册)。
    2. 用户单击他在电子邮件中获得的链接以验证电子邮件是否已收到。

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

    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,因为它似乎是由浏览器自动解码的-当我尝试解码时,它与编码前的字符串不完全相同)。

    因此,我确信我们调用的是同一个方法(ConfirmEmail),并且传递的两个参数是完全相同的字符串。我还知道,令牌只能验证一次,因此我不会在验证一次后再使用它们。

    欢迎提出任何想法。

    1 回复  |  直到 11 年前
        1
  •  2
  •   trailmax    11 年前

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

    任何你不明白的原因 UserManager 是否根据VC2013模板从Owin上下文?

    推荐文章