在我的MVC应用程序中,我有Player
和Coach
个对象,用户可以是其中一个。我还有Team
个对象,我想知道的是我如何阻止Players
列表中的用户或Coach
Team
获取访问权限的用户像/Teams/Details/2
这样的路线,其中2
是团队的ID,而不是他/她所属的团队。
提前致谢!
答案 0 :(得分:0)
由于您要限制他们不属于的ID,这似乎是您可以从AuthorizeAttribute
继承并为AuthorizeCore
您的实施可以检查他们的角色/团队ID并决定做什么/重定向。
public class TeamAuthorize : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
return UserIsInTeam(httpContext); //whatever code you are using to check if the team id is right
}
}
您现在可以像任何其他属性一样应用它。
[TeamAuthorize]
答案 1 :(得分:0)
最简单的解决方案是将URL从使用ID更改为随机GUID。你几乎可以消除某人猜测另一个有效值的可能性。当然,根据定义,这不安全(主要是因为有人可以从历史记录或其他来源获取其他URL),但在某些情况下这已经足够了。
更好的解决方案是基于实现IActionFilter
方法的OnActionExecuting
接口创建新属性,并使用this.ControllerContext.HttpContext.User.Identity.Name
和this.RouteData.Values["id"]
检查ID。然后,您将此属性应用于控制器方法。
在我们当前的系统中,我们通过添加验证用户权限的代码作为每个方法的第一行来实现控制器方法中的行级安全性。检查代码与属性相同,并且需要添加相同数量的代码。这种方法还有一个额外的好处 - 更容易实现方案,例如教练能够看到其他团队的详细信息但不能修改它们(我们根据权限有一个操作和视图用于读取和更新)。
如果您需要访问数据库以检查权限,并且您正在使用IoC框架(例如Ninject和基于构造函数的注入),您还将使用最后一种方法 - 因为您将无法访问属性中的这些值。 / p>