使用表单身份验证的 MVC3 中的简单授权

2024-01-07

我正在尝试做 MVC3 中应该很简单的事情。

我有一个使用表单身份验证通过第三方 SSO 对用户进行身份验证的应用程序。成功登录后,SSO 会发回我的应用程序上的特定控制器操作。然后我打电话FormsAuthentication.SetAuthCookie(user,false);.

我正在尝试实施某种程度的授权。简而言之,一个用户可以存在多个不同的角色,例如Admin and Developer。某些控制器操作应该仅对某些角色可用。用户所属角色的详细信息是通过调用另一个外部 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 行程。

最好的方法是什么?


另一种方法是将角色存储在 FormsAuthentcationTicket 的 UserData 属性中。这可以通过逗号分隔的字符串来完成。

http://msdn.microsoft.com/en-us/library/system.web.security.formsauthenticationticket.formsauthenticationticket http://msdn.microsoft.com/en-us/library/system.web.security.formsauthenticationticket.formsauthenticationticket

然后,在 AuthenticateRequest 方法上,您可以拉回票证,获取角色数据并使用通用主体将其分配给当前用户。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用表单身份验证的 MVC3 中的简单授权 的相关文章

随机推荐