限制对MVC控制器的访问

时间:2013-11-14 19:03:14

标签: asp.net-mvc

假设我们有一个路由为Project/{ProjectID:int}/Page/{PageNumber:int}的控制器 该控制器处理项目,每个项目都有一个int ID,每个项目有100页

因此,第33页的项目1将通过以下方式访问:

http://localhost/project/1/page/33

我知道我可以使用Authorize属性保护对此控制器的访问。例如,只有经过身份验证的用户才能访问“项目”。

关于保护项目访问权限,我有哪些选择?例如,Bill可以访问项目(1,2,3),因此他可以访问上面的控制器,但是如何阻止他访问?

http://localhost/project/4/page/13

2 个答案:

答案 0 :(得分:2)

对于严格的控制器级别授权,AuthorizationAttribute是可行的方法,但对于较低级别的ID授权,我发现最好的方法是只查询用户实际可用的内容。 / p>

换句话说,如果某个项目仅对特定用户可用,那么您无疑会在User模型上拥有Project(或类似)属性(等同于外国数据库级别的密钥)。因此,使用此:当您根据ID获取项目时,也为用户添加条件:

var project = db.Projects.SingleOrDefault(m => m.Id == id && HttpContext.Current.Identity.Name == m.User.Username)
if (project == null)
{
    return new HttpNotFoundResult();
}

从某种意义上说,您不需要限制访问权限,只需将其首先提供给适当的用户即可。

答案 1 :(得分:0)

当然,为此目的最好使用授权属性。 但是,如果你找到其他方法,你可以实现类似的东西:

  protected void Application_AuthorizeRequest(Object sender, EventArgs e)
    {
     string userName = Request.LogonUserIdentity.Name; // Bill
     string page = Request.FilePath; //   project/4/page/    
     if !(AuthorizeUtil.CheckAccess(page, userName)
                   Context.RewritePath("/AccessDenied");     

    }