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

时间:2015-01-06 20:02:41

标签: asp.net asp.net-mvc asp.net-identity

我有一个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的教程代码不起作用?

1 个答案:

答案 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会像那样挑剔,但有解决方案。