我最近决定使用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