我正在寻找解决我正在实施的项目的基于角色的授权的问题。该项目在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传递给方法的情况(或显而易见)。
答案 0 :(得分:1)
在Authorize属性中,您将获得HttpContext。你可以使用这样的东西:
var routeData = new RouteCollection();
MvcApplication.RegisterRoutes(routeData);
var route = routeData.GetRouteData(httpContext);
MvcApplication是您的全局应用程序类。这将绑定路由,然后解析请求以提供已被调用的路由。然后,您可以要求Id参数对其执行额外授权。
的Si