在我的 MVC 应用程序中,我拥有Player
和Coach
对象,用户可以是其中之一。我也有Team
对象,我想知道的是我如何防止在列表中的用户或Players
正在访问路由的用户,例如除了他/她所属的团队之外,团队的 ID在哪里. Coach
Team
/Teams/Details/2
2
提前致谢!
在我的 MVC 应用程序中,我拥有Player
和Coach
对象,用户可以是其中之一。我也有Team
对象,我想知道的是我如何防止在列表中的用户或Players
正在访问路由的用户,例如除了他/她所属的团队之外,团队的 ID在哪里. Coach
Team
/Teams/Details/2
2
提前致谢!
由于您想限制他们不属于的 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]
最简单的解决方案是将 URL 从使用 ID 更改为随机 GUID。您几乎可以消除有人猜测另一个有效值的机会。当然,这在定义上并不安全(主要是因为有人可以从历史记录或其他来源获取其他 URL),但在某些情况下这已经足够了。
更好的解决方案是基于IActionFilter
实现方法的接口创建一个新属性,并使用andOnActionExecuting
来检查 ID 。然后,您将将此属性应用于您的控制器方法。this.ControllerContext.HttpContext.User.Identity.Name
this.RouteData.Values["id"]
在我们当前的系统中,我们在控制器方法中实现了行级安全性,只需将验证用户权限的代码添加为每个方法的第一行。检查代码与属性相同,并且需要添加相同数量的代码。这种方法还有一个额外的好处 - 更容易实现这样的场景,例如教练可以查看其他团队的详细信息但不能修改它们(我们有一个操作和视图用于读取和更新,具体取决于权限)。
如果您需要去数据库检查权限,并且您正在使用 IoC 框架(例如 Ninject)和基于构造函数的注入,您也可以使用最后一种方法 - 因为您将无法访问属性中的这些值。