2013-11-14 154 views
0

假设我们有一个控制器,其途径是Project/{ProjectID:int}/Page/{PageNumber:int} 该控制器用来处理项目,每个都有一个int ID,并且每个项目都有限制访问MVC控制器

100页

所以项目1项,第33页将访问通过:

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

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

关于保护项目访问权限我有哪些选择?例如,比尔可以访问项目(1,2,3),所以他可以访问上面的控制器,但我怎么能阻止他访问?

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

这仍然可以通过AuthorizationAttribute处理,但是,该级别的授权可能最好在域级别处理。 – James

回答

2

对于严格控制级别的授权,AuthorizationAttribute是要走的路,但对于低级别ID授权,我发现最好的方法是只是简单地查询用户实际可用的内容。换句话说,如果某个项目只对特定用户可用,那么Project模型(相当于数据库级别的外键)无疑具有User(或类似)属性。因此,使用这种:当你根据id获取该项目,添加一个条件的用户,以及:

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

从某种意义上说,你并不需要尽可能限制访问只是把它首先提供给适当的用户。

+0

+1对我来说,这是要走的路。所描述的授权问题肯定比控制器级别更具领域级别。 – James

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

    } 
+0

OP是否必须猜测'AuthorizeUtil'的作用?另外'Request.FilePath'不是检查路径的可靠方法,因为它不包含完整路径。 – James