1

我知道,这个问题在 SO 中已经被问过很多次,但我的问题有点不同。

我在GenerateEmailConfirmationTokenAsyncConfirmEmailAsync方法上有一个奇怪的问题。

我在发送电子邮件之前正确使用HttpUtility.UrlEncode和方法。HttpUtility.UrlDecode

奇怪的是,在创建用户和收到邮件后,我永远无法重现任何错误,确认它。但是在相同的环境下,10 个注册用户中就有 3 个报告了 Invalid Token 的问题。

我进行了更多搜索,发现它可能是由于机器密钥而发生的,如果重新启动 IIS 或其他原因或发布后,机器密钥可能会发生变化。所以为了解决这个问题,我生成了一个机器密钥并保存在 web.config 中,但问题似乎仍然存在。

我在 Azure 应用服务中托管它。

对还有什么问题有更多想法吗?

更新:我在这里添加代码供你们查看

string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);

var callbackUrl = new Uri(string.Format("{0}?userId={1}&code={2}", ConfigurationManager.AppSettings["EmailConfirmationURL"], user.Id, HttpUtility.UrlEncode(code)));

string emailTemplate = MailTemplates.UserRegistrationEmailTemplate(FirstName, CompanyName, callbackUrl);

await CustomEmail.SendEmail(new List<string> { user.Email }, "Confirm your account", emailTemplate);

确认工作如下

IdentityResult result = await UserManager.ConfirmEmailAsync(userId, HttpUtility.UrlDecode(code));
4

2 回答 2

0

请使用Url.Action而不是使用字符串连接创建 url。Url.Action在最新的 MVC 版本中进行幕后编码,您可以避免编码和解码操作。

以下是您可以使用的代码片段。

string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);

                        var callbackUrl = Url.Action("ConfirmEmail", "Account", new
                        {
                            userId = user.Id,
                            code = code,
                            returnUrl = model.ReturnUrl
                        }, protocol: Request.Url.Scheme);
于 2017-09-27T12:24:04.780 回答
0

一个可能的原因可能是,如果用户提交令牌的时间过长,则令牌在验证之前就过期了。令牌有一个生命周期,在它们失效之前必须在该生命周期内使用。默认TokenLifespanis一天(24 小时)。

检查身份配置代码以查看对令牌生命周期所做的任何更改。

例如以下代码将令牌设置为在 3 小时内过期

if (dataProtectionProvider != null)
{
    manager.UserTokenProvider =
       new DataProtectorTokenProvider<ApplicationUser>
          (dataProtectionProvider.Create("ASP.NET Identity"))
          {                    
             TokenLifespan = TimeSpan.FromHours(3)
          };
}

使用上面的代码,忘记密码和电子邮件确认令牌将在 3 小时后过期。过期后尝试使用令牌的用户将收到无效令牌错误。

OP 表示无法重现该问题。这可能是因为令牌在令牌生命周期内得到验证。

于 2017-01-19T12:10:51.460 回答