假设我们有一个路由为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
答案 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");
}