0

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

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

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

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

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

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

2 回答 2

2

对于严格的控制器级别授权,AuthorizationAttribute是要走的路,但对于较低级别的 id 授权,我发现最好的方法是仅查询用户实际可用的内容。

换句话说,如果某个项目仅对特定用户可用,那么您无疑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();
}

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

于 2013-11-14T20:40:22.520 回答
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");     

    }
于 2013-11-14T20:22:52.997 回答