拒绝直接URL访问操作方法

Duy*_*Duy 10 c# asp.net-mvc asp.net-mvc-3

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

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

那么你们中有谁知道在asp.net mvc3中这样做的方法吗?

小智 14

下面是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 = "" }));  
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对于您不希望用户直接请求的任何控制器或操作方法,请按如下所示使用操作过滤器

[NoDirectAccess]
public ActionResult IsUsernameUnique()
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,对IsUsernameUnique操作方法的任何直接访问都将自动将用户重定向到Home/Index操作方法.


Ali*_*ghi 4

我不确定,但这也许可以帮助您考虑我们有一个包含此网址的页面

www.yoursite.com/home.aspx
Run Code Online (Sandbox Code Playgroud)

为了避免您的用户直接浏览此页面,您可以像这样重写您的网址

www.yoursite.com/fdmf489ruv30/home.aspx
Run Code Online (Sandbox Code Playgroud)

在此网址中,“fdmf489ruv30”部分是您在 session_start 上创建的唯一字符串,并将在 session_end 上销毁它

  • 如果您无论如何都阻止访问,那么搜索引擎优化实际上不是问题,因为爬虫无法访问这些内容。但是,为了清洁起见,我也会避免这种方法 (3认同)