2013-03-07 96 views
1

在我的MVC应用程序中,我有PlayerCoach对象,并且用户可以是其中一个。我也有Team对象,我想知道的是我如何防止Players列表中的用户或TeamCoach获得对像/Teams/Details/2这样的路由的访问,其中2是除了那个他/她是一部分。防止访问MVC中的路由4

在此先感谢!

+2

只是一个小术语nitpick:你限制accessq到控制器,而不是路由。 – 2013-03-07 17:52:10

+0

@AndrewBarber,以及我仍然需要他们访问控制器我只是不希望用户能够明确地将一个团队的id传递给团队控制器的Details方法,该方法与团队的id不同他们是...的一部分... – JM1990 2013-03-08 11:52:28

回答

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] 
+0

谢谢你!这听起来像是理想的解决方案! :) – JM1990 2013-03-08 11:54:02

0

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

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

在我们当前的系统中,我们通过将验证用户权限的代码添加为每种方法中的第一行来在控制器方法中实施行级安全性。检查代码与属性相同,需要添加相同数量的代码。这种方法还有另外一个好处 - 比较容易实现的情景,例如教练能够看到其他团队的细节但不能修改它们(我们有一个操作和视图,以便根据权限进行读取和更新)。

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

+0

感谢您的答案!听起来很值得考虑! – JM1990 2013-03-08 11:56:17