Roles.GetRolesForUser仅调用默认角色提供程序?

时间:2009-12-15 17:08:46

标签: asp.net roles

我正在使用多个角色提供程序,标准SQL提供程序和自定义提供程序。在Global.asax内部 - RoleManager_GetRoles我为那些应该使用我的自定义提供程序的用户创建一个RolePrincipal,并将提供程序名称设置为我的自定义提供程序,并让其他用户正常处理。

这几乎可以工作,asp.net允许访问通过web.config保护的页面,并调用我的提供程序来获取角色列表。但是,当我在代码中调用Roles.GetRolesForUser()时,它似乎只调用默认角色提供程序,而不是我的自定义提供程序。如果我将自定义提供程序设置为默认提供程序,则会调用它,但只会调用它。

我通过枚举角色提供程序并在提供程序上使用与RolePrincipal匹配的名称调用GetRolesForUser()来解决这个问题,但在我看来,Roles.GetRolesForUser()默认情况下应该这样做

我错过了什么吗?

1 个答案:

答案 0 :(得分:5)

RoleManager和RolePrincipal是用于不同目的的不同对象。

我认为您想要使用的是GetRoles()实例上的RolePrincipal,而不是Roles.GetRolesForUser()

不同之处在于显式RolePrincipal定义了用户和提供者之间的关系,而Roles只是角色提供者的管理对象,如果没有其他信息,则只使用默认提供者。来自documentation for RolePrincipal

  

RolePrincipal对象实现   IPrincipal接口和   代表当前的安全性   HTTP请求的上下文。

     

启用角色管理时(请参阅   角色),RoleManagerModule分配   用户的RolePrincipal对象   Current HttpContext的属性。

     

RolePrincipal类公开了   当前HTTP的安全标识   请求并另外执行   检查角色成员资格。如果   CacheRolesInCookie是真的,那么   RolePrincipal对象管理   缓存的角色列表并查找角色   当前用户的成员资格   首先是缓存列表,然后是角色   供应商。如果CacheRolesInCookie是   false,始终是RolePrincipal对象   使用the查找角色成员资格   角色提供者。

希望有所帮助。