1

在我的 MVC 应用程序中,我拥有PlayerCoach对象,用户可以是其中之一。我也有Team对象,我想知道的是我如何防止在列表中的用户或Players正在访问路由的用户,例如除了他/她所属的团队之外,团队的 ID在哪里. CoachTeam/Teams/Details/22

提前致谢!

4

2 回答 2

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]
于 2013-03-07T17:52:59.613 回答
0

最简单的解决方案是将 URL 从使用 ID 更改为随机 GUID。您几乎可以消除有人猜测另一个有效值的机会。当然,这在定义上并不安全(主要是因为有人可以从历史记录或其他来源获取其他 URL),但在某些情况下这已经足够了。

更好的解决方案是基于IActionFilter实现方法的接口创建一个新属性,并使用andOnActionExecuting来检查 ID 。然后,您将将此属性应用于您的控制器方法。this.ControllerContext.HttpContext.User.Identity.Namethis.RouteData.Values["id"]

在我们当前的系统中,我们在控制器方法中实现了行级安全性,只需将验证用户权限的代码添加为每个方法的第一行。检查代码与属性相同,并且需要添加相同数量的代码。这种方法还有一个额外的好处 - 更容易实现这样的场景,例如教练可以查看其他团队的详细信息但不能修改它们(我们有一个操作和视图用于读取和更新,具体取决于权限)。

如果您需要去数据库检查权限,并且您正在使用 IoC 框架(例如 Ninject)和基于构造函数的注入,您也可以使用最后一种方法 - 因为您将无法访问属性中的这些值。

于 2013-03-07T18:06:27.467 回答