拒绝直接URL访问操作方法

时间:2011-12-01 05:11:26

标签: c# asp.net-mvc asp.net-mvc-3

我正试图找到一种方法来拒绝任何直接访问我的操作方法。基本上我希望用户点击链接进行导航,而不是直接在浏览器的地址栏中输入网址。

现在我知道这可以通过检查请求对象中的urlreferrer来完成,但这有点不可靠和弱,因为urlreferrer可以很容易地被修改,并且一些安全套件实际上将它从请求中删除。

那么你们有没有人知道在asp.net mvc3中做到这一点的方法?

5 个答案:

答案 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到达那里。希望它有所帮助。

question on Stackoverflow

答案 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 = "" }));
            }
        }
    }