我正在使用多个角色提供程序,标准SQL提供程序和自定义提供程序。在Global.asax内部 - RoleManager_GetRoles我为那些应该使用我的自定义提供程序的用户创建一个RolePrincipal,并将提供程序名称设置为我的自定义提供程序,并让其他用户正常处理。
这几乎可以工作,asp.net允许访问通过web.config保护的页面,并调用我的提供程序来获取角色列表。但是,当我在代码中调用Roles.GetRolesForUser()
时,它似乎只调用默认角色提供程序,而不是我的自定义提供程序。如果我将自定义提供程序设置为默认提供程序,则会调用它,但只会调用它。
我通过枚举角色提供程序并在提供程序上使用与RolePrincipal匹配的名称调用GetRolesForUser()
来解决这个问题,但在我看来,Roles.GetRolesForUser()
默认情况下应该这样做
我错过了什么吗?
答案 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查找角色成员资格 角色提供者。
希望有所帮助。