我有一个ASP.NET MVC 5网站,我正在实施基于Microsoft模板的电子邮件确认流程。
在撰写电子邮件正文时,首先我构建一个用户将使用的网址"点击验证您的地址"。
要生成我打电话的安全令牌:
UserManager.GenerateEmailConfirmationTokenAsync(user.Id)
这会生成如下代码:
pporPNj6KzdZ3BYG8vQsKJu3dPJMwGgh+ZEGhCNnf9X6F0AS0f6qCowOQwQNfpYkl14bgEsmyPTKya5H6N4n2na2n5PgO+wpoihXxQTA7G8pK/lUYskX3jy2iA/ZM8m4Vm0prTyUuhMgfDlV+wkbR336FBRIAbKJDwOWvHHbJBDQ21gW93hyzca0li66aI1H
显然,这在网址中无效,但即使是网址编码也无法解决IIS对此类网址的厌恶。
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"));
}
如何让这些生成的令牌更友好?什么可能会改变,这会阻止ASP.NET的教程代码不起作用?
答案 0 :(得分:2)
事实证明,这个令牌会被MVC控制器中的内置类“UrlHelper”或WebAPI控制器中的Url损坏。如果目标路由将这些变量列为路径的一部分,而不是GET vars网址。
例如:此调用,为名为“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会像那样挑剔,但有解决方案。