ASP.NET MVC授权和每个team_id的角色

时间:2009-04-30 16:04:48

标签: asp.net asp.net-mvc

我正在使用ASP.NET MVC开始一个项目,我无法弄清楚基于team_id处理授权和角色的最佳方式是什么。 我阅读的每篇博客文章或论坛帖子总是谈论使用asp.net成员资格或创建CustomAuthorize过滤器来定义全局角色(“admin”,“helpdesk”,“editor”等等)。我的应用程序中的问题是没有全局角色。用户将成为team1的管理员,但无法编辑或查看team2详细信息。 所以授权细节是: - 用户可以查看他的团队规划和他的队友可用性,但无法看到其他团队 - 团队经理可以编辑团队详细信息,但无法编辑其他团队的详细信息 - 团队可以拥有1名或多名经理 - 用户可以是1个或多个团队的一部分

ATM,我有3个表来处理这种关系。

teams --> teams_users <-- users
team_id   #team_id        user_id
          #user_id
          isManager?

作为最后的手段,我正计划在登录时存储用户当前的team_id和会话变量中的isManager状态,并创建一个CustomAuthorize过滤器,用于检查会话team_id是否与model.team_id相同。如果还有其他方法,请告诉我。谢谢

4 个答案:

答案 0 :(得分:1)

然后我会有2个角色 - 经理和用户 然后我会像你指定的那样绑定数据库。

角色将控制每个用户可以执行的操作(用户可以查看信息,管理员可以编辑/创建信息),然后在每个操作中我都会快速检查当前用户。在团队中执行此操作(即用户是否可以访问团队)。

答案 1 :(得分:1)

最后,我最终创建了一个自定义路线:

/{team_id}/controller/action/{id}
用户登录后会设置

{team_id},然后自定义过滤器会验证用户是否属于每个控制器顶部的团队。每当他改变团队时,{team_id}都会更新。 此外,还有一个“isManager”过滤器,用于保护特定管理器操作,以检查用户是否是当前团队的经理。 谢谢你们的回答

答案 2 :(得分:1)

我认为您的解决方案看起来不错。如果您非常依赖ASP.NET角色来为您做最初的解决,那么您将遇到很多问题:

用户1是团队1的经理,团队2的常规用户.ViewSchedule仅供用户阅读,可供管理员编辑。 ViewSchedule上的代码:

if (User.IsInRole("manager")) {
    if (isTeamManager(userid)) {}
}
else {}

bool isTeamManager(int userid) {
    return db.IsTeamManager(userid) {
}

如果您这样做,那么当用户使用第2组时,他将完全错过该区块。就ASP.NET角色而言,他是一名经理,但不是该团队的角色。没问题,显然我们可以结合这样的条件:

if (User.IsInRole("manager") && isTeamManager(userid)) { }
else {}

哦,是的,如果我们正在调用isTeamManager(),那么我们已经获得了User.IsInRole(“manager”)提供的唯一信息,因此我们甚至不需要:

if (isTeamManager(userid)) { }
else {}

所以现在我们甚至没有在代码中使用角色。我只是坚持你原来的想法。

答案 3 :(得分:0)

我开发了两个自定义属性来处理这样的情况:RoleOrOwnerAuthorization和RoleOrOwnerAssociatedAuthorization。 RoleOrOwner查看系统的当前用户是否与相关数据的用户ID相同。也就是说,您被授权查看自己的数据。 RoleOrOwnerAssociated检查连接表中是否存在将数据与当前用户相关联的行。例如,我可能有Groups,GroupLeaders和Users,其中GroupLeaders是一个将Groups链接到Users的连接表。要查看组的数据,您需要具有ViewGroups角色或组成领导者(由GroupLeaders中具有组ID和您的ID的行证明)。我认为这很有效。