1

我正在寻求解决我在为我正在从事的项目实施基于角色的授权时遇到的问题。该项目位于 ASP.NET MVC 3 中。

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

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

因此,用户可能在一个项目中拥有角色 A,可能在另一个项目中拥有角色 B,而在另一个项目中拥有角色 C。

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

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

在这种情况下,即使我编写了一个自定义属性,我也不知道用户调用这个任务的对象是哪个项目(以及随后的哪个团队),直到我在方法内部并且可以访问“id”参数.

到目前为止,我已经考虑过创建另一个类,但这仍然必须位于 Action Method 中,以便它知道当前的 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 未传递到方法中(或显而易见)的情况。

4

1 回答 1

1

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

var routeData = new RouteCollection();

MvcApplication.RegisterRoutes(routeData);

var route = routeData.GetRouteData(httpContext);

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

于 2012-09-17T12:40:18.813 回答