如何保护 MVC4 路由并更新包含 OAuth 参数的操作链接



>假设您有一个页面,其中路由/Checkout/Complete/1 完成了 OAuth google UserID 1 的订单。这在操作链接中实现如下:

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

现在这种方法的最大缺陷是,填满购物车的网站用户只需输入/Checkout/Complete/2 之类的链接,并在另一个 UserId 上下订单,这样他们就不必付款。

我试图做的是在路由配置中创建一个条目,如下所示:

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 匹配,并以其他方式引用错误页面?如果有更好的方法来实现这一目标,我很想听听。

好的,

只要输入问题,我就可以更好地了解我想要完成的任务。我通过将 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 中的约束来修复。有人知道怎么做吗?

最新更新