在我的MVC应用程序中,我有Player和Coach对象,用户可以是其中之一。我也有Team对象,我想知道的是如何阻止Players列表中的用户或Team的Coach访问像/Teams/Details/2这样的路由,其中2是团队的id,而不是他/她所在的团队。
提前感谢!
发布于 2013-03-08 01:53:00
由于您希望限制一个不属于它们的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]发布于 2013-03-08 02:06:27
最简单的解决方案是将URL从使用ID更改为随机GUID。您几乎可以消除有人猜测另一个有效值的可能性。当然,根据定义,这是不安全的(主要是因为有人可以从历史或其他来源获得另一个URL ),但在某些情况下,这就足够了。
更好的解决方案是基于实现OnActionExecuting方法的IActionFilter接口创建一个新属性,并使用this.ControllerContext.HttpContext.User.Identity.Name和this.RouteData.Values["id"]检查ID。然后将该属性应用于控制器方法。
在我们当前的系统中,我们在控制器方法中实现了行级安全性,只需在每个方法中添加验证用户权限的代码作为第一行。检查代码与属性相同,并且需要添加相同数量的代码。这种方法还有一个额外的好处--更容易实现这样的场景,即教练可以看到其他团队的详细信息,但不能修改它们(我们有一个动作和视图,用于根据权限读取和更新)。
如果你需要去数据库检查权限,并且你正在使用IoC框架,比如基于构造函数的注入,你也可以使用最后一种方法-因为你不能访问属性中的那些值。
https://stackoverflow.com/questions/15278188
复制相似问题