UserManager.GenerateEmailConfirmationToken 返回不适合 URL 传输的令牌



我有一个 ASP.NET 的MVC 5网站,我正在根据Microsoft的模板实施电子邮件确认流程。

在撰写电子邮件正文文本时,首先我构造用户将用于"单击以验证您的地址"的 URL。

要生成安全令牌,我调用:

UserManager.GenerateEmailConfirmationTokenAsync(user.Id)

这将生成如下代码:

pporPNj6KzdZ3BYG8vQsKJu3dPJMwGgh+ZEGhCNnf9X6F0AS0f6qCowOQwQNfpYkl14bgEsmyPTKya5H6N4n2na2n5PgO+wpoihXxQTA7G8pK/lUYskX3jy2iA/ZM8m4Vm0prTyUuhMgfDlV+wkbR336FBRIAbKJDwOWvHHbJBDQ21gW93hyzca0li66aI1H

显然,这在 URL 中无效,但即使是 URL 编码也无法解决 IIS 对此类 URL 的仇恨。

HTTP Error 404.11 - Not Found
The request filtering module is configured to deny a request that contains a double escape sequence.

在我的 UserManager 实现中,我使用的是 TokenProvider 的教程样板代码。

 var dataProtectionProvider = options.DataProtectionProvider;
        if (dataProtectionProvider != null)
        {
            manager.UserTokenProvider = new DataProtectorTokenProvider<SiteUser>(dataProtectionProvider.Create("ASP.NET Identity"));
        }

如何使这些生成的令牌对 URL 更友好? 哪些可能改变会阻止 ASP。NET的教程代码不起作用?

事实证明,如果目标路由将这些变量列为路径的一部分,而不是 URL 的 GET vars,则此令牌将被 MVC 控制器中的内置类"UrlHelper"或 WebAPI 控制器中的 URL 破坏。

例如:此调用,为站点路由创建一个名为"ConfirmEmail"的相对URL,并填写空白

Url.Route("ConfirmEmail", new { userId = user.Id, code = code });

在我的路线之前是:

[Route("register-email/{code}/{userId}", Name = "ConfirmEmail")]

将其更改为:

    [Route("register-email", Name = "ConfirmEmail")]

生成 IIS 可以咀嚼的有效 URL。如果未指定这些,它们将追加在 ?标记为正常的 GET 变量。 不知道为什么IIS这样挑剔,但有解决方案。

最新更新