【问题标题】:Handling "extra" params in ASP.Net MVC5 routing处理 ASP.Net MVC5 路由中的“额外”参数
【发布时间】:2016-01-27 11:05:03
【问题描述】:

我有这条路需要处理:

http://mpdev.website.com/Account/ExternalLogOn?LogonTicket=c3792319c8711a0dd465bbd6f6b31ea913b42db7&PID=1137565&ReturnUrl=/Home/CompReq?EC=151120TXAM

帐户控制器中的 ExternalLogon 操作会根据 LogonTicket 和 PID 之间的检查自动让用户登录。然后它应该重定向到 ReturnUrl。

如何修复 /Home/CompReq 路由来处理 EC 参数以及如何修改 Home Controller 中的 Action?

我的 RouteConfig 中只有一条路线:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

此链接完美运行,但我知道我没有任何参数。

http://mpdev.website.com/Account/ExternalLogOn?LogonTicket=c3792319c8711a0dd465bbd6f6b31ea913b42db7&PID=1137565&ReturnUrl=/Home/MyInfo

Home Controller Action 定义如下:

public ActionResult CompReq(string eventcode)

外部登录定义:

ExternalLogOn(string LogonTicket, int? PID, string User, string EC, String State, string ReturnUrl)

【问题讨论】:

  • 当您传递带有“EC”部分的路径时,ExternalLogon 操作的 ReturnUrl 参数包含什么?
  • 没有得到你想要的
  • 您的名为“ExternalLogon”的操作可能有 3 个输入参数; LogonTicket、PID 和 ReturnUrl 对吗?当您使用有问题的路径调用 ReturnUrl 时,它包含什么?
  • 它包含应该存在的内容/Home/CompReq?EC=151120TXAM,但随后出现异常:A potentially dangerous Request.Path value was detected from the client (?).
  • 为您提供两种解决方案,您可以试试这个stackoverflow.com/questions/14475913/…,也可以将returnUrl 值存储到您的LogonTicket 旁边的数据库中

标签: c# asp.net-mvc


【解决方案1】:

ReturnUrl 值应该是 url 编码的:

http://mpdev.website.com/Account/ExternalLogOn?LogonTicket=c3792319c8711a0dd465bbd6f6b31ea913b42db7&PID=1137565&ReturnUrl=%2FHome%2FCompReq%3FEC%3D151120TXAM

CompReq 操作的函数参数名称应与查询参数名称相同:

public ActionResult CompReq(string EC)

ExternalLogon 动作应该有适当的参数:

ExternalLogOn(string LogonTicket, int? PID, string ReturnUrl)

在 ExternalLogOn 中,您重定向到 ReturnUrl 参数:

return Redirect(ReturnUrl); 

【讨论】:

  • 你应该只有一个“?”网址中的字符。这就是为什么你应该编码查询参数值(如果你使用 UrlHelper 方法来创建 url,MVC 已经为你处理了)
  • 连URLEncoding ?将导致相同的异常。我已通过将参数移动到 URL 的第一部分来修复它,请参阅 ExternalLogon 定义中的 EC 参数?
  • 只是编码'?'是不足够的。您必须对整个查询参数值进行编码:/Home/CompReq?EC=151120TXAM。如果您在我的回答中打开第一个网址,您是否仍然会收到“潜在危险值”异常?
  • 正如我所说,我已经继续前进,没有问题将 EC 参数移到 ReturnUrl 之外。
猜你喜欢
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 2015-09-20
  • 2011-01-08
  • 2023-04-02
  • 2014-11-01
  • 2018-11-12
  • 2015-05-07
相关资源
最近更新 更多