2011-12-01 72 views
7

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

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

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

+0

如何“安全”这是否需要呢?你只是想阻止用户能够书签和/或输入网址?或者你是否真的想要让那些真正知道如何欺骗Javascript和cookies的人确保安全? –

+0

我想尽可能保证安全,这就是为什么urlreferrer不太合适,因为它可以很容易地欺骗 – Duy

+0

这是为了防止CSRF?或者你是否真的需要阻止即使“授权”用户欺骗有效请求? –

回答

3

我不知道,但也许这个提议可以帮你老兄 让认为你有这样

www.yoursite.com/home.aspx 

OK网址?为避免你的用户直接眉头此页面,您可以重写你的URL这样

www.yoursite.com/fdmf489ruv30/home.aspx 

,并在此URL中的部分“fdmf489ruv30”是创建它的session_start,并会破坏它Session_End中

一个唯一的字符串

你明白了吗?还是需要更多关于这个想法的描述? 你可以搜索这种URL重写的家伙。

+0

这是一个好主意。但是,如果唯一标识是查询字符串,它不会有效吗? –

+0

我真的不想这样做,因为这会让网址混乱而不是seo友好。 – Duy

+0

是的,对于搜索引擎优化是一个坏主意(尝试通过SEO的其他概念获得更好的排名)。和关于查询字符串,我没有测试,如果我self.try它,并说我的结果 –

0

这样做的一个快速方法是在重定向的动作中设置包含随机数的会话,并将该随机数作为参数传递给其他动作。

在其他操作(重定向的)内部,将会话的值与操作的参数进行比较。如果值相同,则用户按下按钮即可到达那里,否则,用户通过更改URL来到达那里。希望能帮助到你。

question on Stackoverflow

0

这是不可能安全地确保授权用户不能欺骗一个有效的请求。
毕竟,如果浏览器可以创建一个“有效请求”,那么授权用户也可以这么做

但是,这是一个不寻常的要求,我很想知道它背后的动机是什么?

但是,有很多方法可以更难以欺骗请求。
由于没有方法将是完全安全的,您可以尝试混淆并使其繁琐有人欺骗您的请求。

正如其他人所建议的,您可以为每个会话创建一个随机“标记”,并在URL中要求它(作为路径或查询字符串)。

对此使用JavaScript会更好。用这个“标记”呈现隐藏的输入。然后,拦截每个链接的click事件,将“标记”值附加到该URL,然后导航到该URL。

您可以在使用JavaScript之前以某种方式“加强”您的令牌,并缩小您的JavaScript以使其混淆......这绝对会阻止高于平均水平的用户修补您的URL。

有很多可能的解决方案,但“正确的”解决方案实际上取决于您试图阻止的具体行为。

+0

同意这一点。你想达到什么目的?您可以创建一个全局html页面容器,并使用基于Ajax的操作来返回您嵌入的html。 Ajax操作可以通过属性或其他隐藏标记方法来限制直接访问URL。 – Roman

7

下面是该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操作方法的任何直接的访问会自动将用户重定向到主/索引操作方法。

+1

它在一定程度上解决了问题(一定程度) – Aji

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