代码之家  ›  专栏  ›  技术社区  ›  Raciel R.

MVC4操作仅在本地调试时触发

  •  4
  • Raciel R.  · 技术社区  · 12 年前

    我有一个用于重置用户密码的操作:

    public class Password : Controller{
      public ActionResult Reset(string id)
      {
        //...
      }
    
    }
    

    这个 身份证件 实际上是 加密电子邮件 当被问及密码恢复用于哪个电子邮件地址时,用户提供的地址。

    因此,如果我单击“忘记密码?”链接,并提供电子邮件地址user@domain.com发送到用户电子邮件的结果url类似于:

    http://www.myapp.com/admin/password/reset/euPdxABQEgE0JDuv6OHSLnk1QBYf73YseBUZwR9+MJA=

    这将被路由到上述密码控制器上的重置操作。 当我在本地调试应用程序时,这工作正常。 这是 不是 在我的测试服务器上工作;我得到的是404。

    有趣的事实:

    1. 如果我从url中删除Id http://www.myapp.com/admin/password/reset/ 我被重定向到 用正确的消息索引密码控制器的操作 应为“无效链接”。
    2. 如果id中包含任何其他字符串(例如: http://www.myapp.com/admin/password/reset/abc123 )我得到了预期的重定向;如1)中所述。

    因此,这似乎与我传递的id的解剖结构有某种关系。我尝试了url编码,但没有成功。

    这是管理区域的路线定义:

    public override void RegisterArea(AreaRegistrationContext context)
    {
       context.MapRoute(
          "Admin_default",
          "Admin/{controller}/{action}/{id}",
           new { controller = "Login", action = "Index", id = UrlParameter.Optional }
       );
    }
    

    主要路线是默认路线。

    有什么想法吗?

    1 回复  |  直到 12 年前
        1
  •  4
  •   Darin Dimitrov    12 年前

    我怀疑这是因为 + 登录url的路径部分。你可以看看 following blog post 其中Scott Hanselman解释了尝试在路径部分传递此类特殊字符时遇到的困难。

    我只引用他的结论:

    经过这么多努力在请求路径中找到疯狂的东西 值得一提的是,只需将值作为查询的一部分 字符串(还记得本文开头的方式吗?)更容易, 更清洁、更灵活、更安全。

    因此,只需删除它并使用以下url:

    http://www.myapp.com/admin/password/reset?id=euPdxABQEgE0JDuv6OHSLnk1QBYf73YseBUZwR9%2BMJA%3D
    

    请注意我是如何对字符串进行url编码的,这是在将参数作为查询字符串值传递到url中时应该执行的操作。

    推荐文章