我正试图找到一种方法来拒绝任何直接访问我的操作方法。基本上我希望用户点击链接进行导航,而不是直接在浏览器的地址栏中输入网址。
现在我知道这可以通过检查请求对象中的urlreferrer来完成,但这有点不可靠和弱,因为urlreferrer可以很容易地被修改,并且一些安全套件实际上将它从请求中删除。
那么你们有没有人知道在asp.net mvc3中做到这一点的方法?
答案 0 :(得分:13)
以下是NoDirectAccessAttribute方法的代码,用于限制对应用NoDirectAccess属性的任何类或操作方法的直接访问
using System;
using System.Web.Mvc;
using System.Web.Routing;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class NoDirectAccessAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.UrlReferrer == null ||
filterContext.HttpContext.Request.Url.Host != filterContext.HttpContext.Request.UrlReferrer.Host)
{
filterContext.Result = new RedirectToRouteResult(new
RouteValueDictionary(new { controller = "Home", action = "Index", area = "" }));
}
}
}
对于您不希望用户直接向其请求的任何控制器或操作方法,请按如下所示使用操作过滤器
[NoDirectAccess]
public ActionResult IsUsernameUnique()
在上面的示例中,任何对IsUsernameUnique操作方法的直接访问都会自动将用户重定向到Home / Index操作方法。
答案 1 :(得分:3)
我不确定但也许这个优惠可以帮助你 我们认为你有这样的网址
www.yoursite.com/home.aspx
好吗?为避免您的用户直接浏览此页面,您可以像这样重写您的URL
www.yoursite.com/fdmf489ruv30/home.aspx
并在此url中,“fdmf489ruv30”部分是您在session_start上创建的唯一字符串,并将在session_end上销毁它
你得到它还是需要更多关于这个想法的描述?! 你可以搜索这种网址重写老兄。
答案 2 :(得分:0)
快速执行此操作的方法是在重定向的操作中设置包含随机数的会话,并将随机数作为参数传递给其他操作。
在其他操作(重定向的操作)中,将会话的值与操作的参数进行比较。如果值相等,则用户通过按下按钮到达那里,否则,用户通过更改URL到达那里。希望它有所帮助。
答案 3 :(得分:0)
不可能安全地确保授权用户不能欺骗有效请求 毕竟,如果浏览器可以创建“有效请求”,那么授权用户也可以!
但是,这是一个不寻常的要求,我很想知道它背后的动机是什么?
然而,有很多方法可以使欺骗请求变得更加困难 由于没有任何方法可以完全安全,您可以尝试混淆并使其单调乏味,以便某人欺骗您的请求。正如其他人所建议的那样,您可以为每个会话创建一个随机的“令牌”,并在URL中要求它(作为路径或查询字符串)。
为此使用JavaScript会更好。使用此“标记”渲染隐藏的输入。然后,拦截每个链接的click
事件,将“标记”值附加到URL,然后导航到URL。
您可以在使用JavaScript之前以某种方式“处理”您的令牌,并将JavaScript缩小以对其进行模糊处理......这肯定会阻止高于平均水平的用户修改您的网址。
有很多可能的解决方案,但“正确”的解决方案实际上取决于您试图阻止的具体行为。
答案 4 :(得分:0)
在Global.asax.cs中使用此代码并将[NoDirectAccess]调用到所有控制器
//Prevent direct URL access: Call [NoDirectAccess] to all controllers to block
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class NoDirectAccessAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.HttpContext.Request.UrlReferrer == null ||
filterContext.HttpContext.Request.Url.Host != filterContext.HttpContext.Request.UrlReferrer.Host)
{
filterContext.Result = new RedirectToRouteResult(new
RouteValueDictionary(new { controller = "Home", action = "Login", area = "" }));
}
}
}