Identity 2.0和密码恢复 - 在ResetPassword()控制器操作中code = null

时间:2014-07-01 20:12:05

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

我最近决定使用ASP.NET Identity 2.0进行帐户确认和密码恢复。根据MVC新Web应用程序中的源文件说明,我按照tutorial关于如何执行此操作。

我遇到密码恢复问题。一切似乎都运行正常 - 用户收到一封带有点击链接的电子邮件。该链接如下所示:

http://localhost:59655/Account/ResetPassword?userId=67502d68-67b9-4c45-8500-799e641eca06
&code=9oHWvEJhyN5PaEclX06sUGgUMP6NkrCWfBTFsGg1xutPcDCzKxoO9SADPkVfz04Q84ZGNp%2F0
aTyL42f2MG98pBiBhF0fbTTYw4EepEpuT%2FotKSppriMZVTOVTMy6IrzF4jR8tzNaT7vtRKwwmcX2tskuDs7
Ew6DLJjPXCTa82uN4A1zAHGfLVnQ3gEmF%2BmvLwoeFkwB2SfvuLKqKAmMtMQ%3D%3D

点击链接后,我会看到一个页面:

Error.

An error occurred processing your request.

我在/Account/ResetPassword(string code)操作中设置了一个断点。根据例子,我创建了如下例程:

[AllowAnonymous]
public ActionResult ResetPassword(string id, string code)
{
    if (code == null)
    {
        return View("Error");
    }
    return View();
}

在输入时,code等于null,因此会显示错误视图。

我可以在Fiddler中看到,根据在上面的电子邮件中发送的方式,URL是完整的。我不相信密码恢复例程有什么问题,但我认为这是我在其他控制器操作中遇到的类似问题。也就是说,使用名称与默认值不同的参数(在RouteConfig.cs中配置)调用Controller Action会导致Controller Action参数中出现空值。

例如,RouteConfig中的默认参数是id。如果我将参数中的名称更改为其他任何名称,则它将包含null:

http://example.com/Account/TestAction/testvalue

[AllowAnonymous]
public ActionResult TestAction(string id)
{
    // id = testvalue
}

[AllowAnonymous]
public ActionResult TestAction(string someid)
{
    // id = null
}

好的,我不明白为什么会发生这种情况 - 但我接受它没有问题。

关于我的问题,在电子邮件中发送给用户的URL包含2个QueryString参数 - userId和Code。我已经检查了示例应用程序,该应用程序显示了如何编码和配置帐户确认和密码恢复。在RouteConfig.cs中设置默认路由并且ResetPassword()Action上的参数名称为string code。它不仅名称与id不同,而且也是单参数定义,而不是我期望(string userId, string code)的2个参数。

这个含糊不清的描述是否提示code = null为什么要进入我的ResetPassword(string code)控制器操作?

如果RouteConfig.cs仅包含默认配置并且参数已被命名为id以外的其他内容,那么Controller Action参数是否始终为null?

对于我的ResetPassword Controller Action,如何在RouteConfig.cs中编码配置以使用包含userId和代码的上述QueryString来调用它?

修改

为了测试RouteConfig.cs中需要路由配置的理论,我添加了以下内容:

routes.MapRoute("ResetPassword",
    "{controller}/{action}/{userId}/{code}",
    new
        {
        controller = "Account",
        action = "ResetPassword",
        });

点击电子邮件中的链接导致:

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

我还在详细的错误说明中看到userId=code=已从链接中删除,并替换为/。基本上使它们成为URI的一部分,而不仅仅是QueryString参数。由于所有这些,我不认为RouteConfig.cs配置与问题有任何关系。

有什么建议吗? :S

0 个答案:

没有答案