C# 如何保护MVC4路由并更新包含OAuth参数的ActionLink
假设您有一个页面,其中route/Checkout/Complete/1完成了OAuth google用户ID 1的订单。这在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)
@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页面或出现错误的页面?是的,您需要使用自定义错误处理。发布一个关于这个的新问题。