【发布时间】:2012-06-08 12:42:29
【问题描述】:
我正在尝试做在 MVC3 中应该很简单的事情。
我有一个应用程序,它使用表单身份验证通过第 3 方 SSO 对用户进行身份验证。 SSO 成功登录后,会回发到我的应用程序上的特定控制器操作。然后我打电话给FormsAuthentication.SetAuthCookie(user,false);。
我正在尝试实施某种级别的授权。简单地说,一个用户可以存在多个不同的角色,例如Admin 和 Developer。某些控制器操作应该只对某些角色可用。用户所属角色的详细信息是通过调用另一个外部 API 获得的,该 API 返回一个简单的 JSON 响应指示。
理论上,在我设置 FormsAuthentication cookie 后,这应该像这样简单:
string[] rolelist = GetRoleListForUserFromAPI(User.Identity.Name);
HttpContext.User = new GenericPrincipal(User.Identity, rolelist);
但是,我不能在调用SetAuthCookie 之后直接调用它,因为此时HttpContext.User 没有任何意义。
我可以尝试对每个请求进行设置,但对我的应用程序的任何请求都意味着往返 API 调用。
到目前为止,我见过的最有前途的方法是创建一个自定义 Authorization 属性并覆盖 OnAuthorization 以执行以下操作:
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (<some way of checking if roles have already been set for this user, or role cache has timed out>)
{
string[] rolelist = GetRoleListForUserFromAPI(filterContext.HttpContext.User.Identity.Name);
filterContext.HttpContext.User = new GenericPrincipal(filterContext.HttpContext.User.Identity,rolelist);
}
}
然后我可以在控制器操作前使用[MyCustomAuthorization(Roles="Admin")] 来实现魔法。
但是,我不知道如何检测当前的 HttpContext.User 对象是否设置了角色,或者它是否是在某个时间之前设置的并且需要另一个 API 行程。
最好的方法是什么?
【问题讨论】:
标签: asp.net-mvc-3 forms-authentication authorization