如何保护MVC4 Route并更新包含OAuth参数的ActionLink

时间:2013-11-06 15:24:43

标签: c# asp.net-mvc-4 visual-studio-2012 oauth

想象一下,您有一个页面,其中路径/结帐/完成/ 1完成了OAuth google UserID 1的订单。这在ActionLink中实现如下:

@Html.ActionLink("Submit>>", "Complete", "Checkout",
    new { id = WebSecurity.CurrentUserId }, null)

现在,这种方法的一个重大缺陷是,填满购物车的网站用户只需输入/ Checkout / Complete / 2等链接,然后将订单放在另一个UserId上,这样他们就无需付费。

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

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 } 
        );
}

不幸的是,这种方法不起作用。

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

1 个答案:

答案 0 :(得分:0)

好的,只要输入问题,我就能更好地了解我想要完成的任务。我通过将if语句(id == WebSecurity.CurrentUserId)添加到CheckoutController文件来解决了这个问题,如下所示:

// 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中使用约束来修复。任何人都知道怎么做?