基于角色的授权与额外扭曲

时间:2012-09-17 09:01:16

标签: asp.net asp.net-mvc-3 roleprovider

我正在寻找解决我正在实施的项目的基于角色的授权的问题。该项目在ASP.NET MVC 3中。

应用程序对用户进行身份验证,这些用户具有与之关联的某些系统范围的角色。这部分我很好。

问题出现在应用程序中的项目,团队和团队角色的概念中。对于经理创建的每个项目,他们可以创建一个团队。该团队由其他系统用户组成,他们将在团队中承担角色,但仅针对该项目。

因此,用户可能在一个项目中拥有角色A,并且可能在另一个项目中具有角色B,在另一个项目中具有角色C.

我面临的最大问题是,目前Action Method可能有签名(示例代码,而不是真正的代码):

[Authorize(Roles = "SomeExampleSystemRole")]
public ActionResult DoSomeTask(Guid id)
{
    // id is the project id.
}

在这种情况下,即使我编写了自定义属性,我也不知道用户正在调用此任务的哪个项目(以及随后的哪个团队),直到我进入方法并且可以访问' id'参数。

到目前为止,我已经考虑过创建另一个类,但是这仍然必须位于Action方法中,以便它知道当前的Project id:

[Authorize(Roles = "SomeExampleSystemRole")]
public ActionResult DoSomeTask(Guid id)
{
    // some code to get the current user identity.

    // id is the project id.
    TeamAuthorization auth = new TeamAuthorization(userIdentity, id);

    bool authPassed = auth.DoesUserHaveTeamRole("RoleC");
}

但是,如果用户没有所需的系统角色,他们将永远不会访问“操作方法”中的辅助授权代码。

有没有人对如何优雅地解决这种瞬态角色问题有任何想法?此外,我们正在摆脱基于会话的大量实施,并且不会设想基于“会话”的解决方案是可管理的。

我目前正在考虑团队角色是否与系统角色不同,如果是,那么上面的解决方案可能部分有效。

使用Attributes是否可以读取方法参数中的'id'?

任何建议都将不胜感激。非常感谢。

编辑:

我有一个额外的想法,最好只是应用全局Authorize属性来确保用户通过身份验证,然后将系统角色转换为TeamAuthorization类,至少系统和团队角色可以加入一个超集。这也适用于未将项目或团队ID传递给方法的情况(或显而易见)。

1 个答案:

答案 0 :(得分:1)

在Authorize属性中,您将获得HttpContext。你可以使用这样的东西:

var routeData = new RouteCollection();

MvcApplication.RegisterRoutes(routeData);

var route = routeData.GetRouteData(httpContext);

MvcApplication是您的全局应用程序类。这将绑定路由,然后解析请求以提供已被调用的路由。然后,您可以要求Id参数对其执行额外授权。

的Si