我正在尝试在MVC3中执行一项简单的任务。
我的应用程序使用表单身份验证来验证与第三方SSO的用户身份。成功登录后,SSO会将用户回传到我的应用程序上的特定控制器操作。然后我调用FormsAuthentication.SetAuthCookie(user,false);
。
我正在尝试实现某种程度的授权。简而言之,用户可以存在于多个不同的角色中,例如管理员
和开发人员
。某些控制器操作只应该对某些角色可用。通过调用另一个外部API获取用户所属角色的详细信息,该API返回简单的JSON响应。
理论上,只需在设置FormsAuthentication cookie后执行以下操作即可:
string[] rolelist = GetRoleListForUserFromAPI(User.Identity.Name);
HttpContext.User = new GenericPrincipal(User.Identity, rolelist);
然而,在调用SetAuthCookie
之后,我不能直接调用它,因为此时的HttpContext.User
没有任何有意义的内容。
我可以尝试在每个请求上设置这个值,但是这意味着我的应用程序每次请求都需要进行一次 API 调用。
到目前为止,我看到的最有希望的方法是创建一个自定义的授权属性,并覆盖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 请求来完成。对于这个问题,最好的方法是什么?