我有一个用于重置用户密码的操作:
public class Password : Controller{ public ActionResult Reset(string id) { //... } }
这个 身份证件 实际上是 加密电子邮件 当被问及密码恢复用于哪个电子邮件地址时,用户提供的地址。
因此,如果我单击“忘记密码?”链接,并提供电子邮件地址user@domain.com发送到用户电子邮件的结果url类似于:
http://www.myapp.com/admin/password/reset/euPdxABQEgE0JDuv6OHSLnk1QBYf73YseBUZwR9+MJA=
这将被路由到上述密码控制器上的重置操作。 当我在本地调试应用程序时,这工作正常。 这是 不是 在我的测试服务器上工作;我得到的是404。
有趣的事实:
因此,这似乎与我传递的id的解剖结构有某种关系。我尝试了url编码,但没有成功。
这是管理区域的路线定义:
public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Admin_default", "Admin/{controller}/{action}/{id}", new { controller = "Login", action = "Index", id = UrlParameter.Optional } ); }
主要路线是默认路线。
有什么想法吗?
我怀疑这是因为 + 登录url的路径部分。你可以看看 following blog post 其中Scott Hanselman解释了尝试在路径部分传递此类特殊字符时遇到的困难。
+
following blog post
我只引用他的结论:
经过这么多努力在请求路径中找到疯狂的东西 值得一提的是,只需将值作为查询的一部分 字符串(还记得本文开头的方式吗?)更容易, 更清洁、更灵活、更安全。
因此,只需删除它并使用以下url:
http://www.myapp.com/admin/password/reset?id=euPdxABQEgE0JDuv6OHSLnk1QBYf73YseBUZwR9%2BMJA%3D
请注意我是如何对字符串进行url编码的,这是在将参数作为查询字符串值传递到url中时应该执行的操作。