C# 如何保护MVC4路由并更新包含OAuth参数的ActionLink

C# 如何保护MVC4路由并更新包含OAuth参数的ActionLink,c#,asp.net-mvc-4,visual-studio-2012,oauth,C#,Asp.net Mvc 4,Visual Studio 2012,Oauth,假设您有一个页面,其中route/Checkout/Complete/1完成了OAuth google用户ID 1的订单。这在ActionLink中实现,如下所示: @Html.ActionLink("Submit>>", "Complete", "Checkout", new { id = WebSecurity.CurrentUserId }, null) public static void RegisterRoutes(RouteCollection routes)

假设您有一个页面,其中route/Checkout/Complete/1完成了OAuth google用户ID 1的订单。这在ActionLink中实现,如下所示:

@Html.ActionLink("Submit>>", "Complete", "Checkout",
    new { id = WebSecurity.CurrentUserId }, null)
public static void RegisterRoutes(RouteCollection routes)
{
    int currentUserId = WebSecurity.CurrentUserId;

    routes.MapRoute(
        name: "Checkout",
        url: "{controller}/{action}/{id}",
        defaults: new {controller = "Checkout", action = "Complete", id = 
                                                     UrlParameter.Optional},
        constraints: new { id = currentUserId } 
        );
}
// GET: /Checkout/Complete
[Authorize]
public ActionResult Complete(int id)
{
     if (id == WebSecurity.CurrentUserId)
     {
     //do stuff
     }
     else {
     //tell user to not do that
     }
}
现在,这种方法的一个大缺陷是,填写购物车的网站用户只需输入/Checkout/Complete/2这样的链接,然后在另一个用户ID上下单,这样他们就不必付费了

我尝试在routeconfig中创建一个条目,如下所示:

@Html.ActionLink("Submit>>", "Complete", "Checkout",
    new { id = WebSecurity.CurrentUserId }, null)
public static void RegisterRoutes(RouteCollection routes)
{
    int currentUserId = WebSecurity.CurrentUserId;

    routes.MapRoute(
        name: "Checkout",
        url: "{controller}/{action}/{id}",
        defaults: new {controller = "Checkout", action = "Complete", id = 
                                                     UrlParameter.Optional},
        constraints: new { id = currentUserId } 
        );
}
// GET: /Checkout/Complete
[Authorize]
public ActionResult Complete(int id)
{
     if (id == WebSecurity.CurrentUserId)
     {
     //do stuff
     }
     else {
     //tell user to not do that
     }
}
不幸的是,这种方法不起作用


如何创建一个约束来检查Websecurity.CurrentUserId是否与实际的CurrentUserId匹配,或者是否引用了错误页面?如果有更好的方法来实现这个目标,我很乐意听到他们的意见。

好的,只要把问题打出来,我就对我要实现的目标有了更好的了解。我通过将if语句(id==WebSecurity.CurrentUserId)添加到CheckoutController文件中解决了这个问题,如下所示:

@Html.ActionLink("Submit>>", "Complete", "Checkout",
    new { id = WebSecurity.CurrentUserId }, null)
public static void RegisterRoutes(RouteCollection routes)
{
    int currentUserId = WebSecurity.CurrentUserId;

    routes.MapRoute(
        name: "Checkout",
        url: "{controller}/{action}/{id}",
        defaults: new {controller = "Checkout", action = "Complete", id = 
                                                     UrlParameter.Optional},
        constraints: new { id = currentUserId } 
        );
}
// GET: /Checkout/Complete
[Authorize]
public ActionResult Complete(int id)
{
     if (id == WebSecurity.CurrentUserId)
     {
     //do stuff
     }
     else {
     //tell user to not do that
     }
}
这管用

不幸的是,当您访问例如/Checkout/Complete/joe时,我们仍然收到这样的信息:

The parameters dictionary contains a null entry for parameter 'id' of non-nullable 
type 'System.Int32' for method 'System.Web.Mvc.ActionResult Complete(Int32)' 

我认为这确实需要通过routeconfig.cs中的约束来解决。有人知道怎么做吗?

“Joe”不是整数,该路由需要一个数字用户id。但是,是的,这根本不是路由问题,而是安全问题,所以这种方法是最好的。@Mansfield,您如何安排不存在的页面,如/Checkout/Complete/Joe页面。它们现在显示一条丑陋的错误消息。是否有可能将所有这些重新路由到一个常见的404页面或出现错误的页面?是的,您需要使用自定义错误处理。发布一个关于这个的新问题。