我有一个 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这样挑剔,但有解决方案。