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

Edd*_*die 2 asp.net roles

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

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

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

我错过了什么吗?

wom*_*omp 5

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

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

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

RolePrincipal对象实现IPrincipal接口,并表示HTTP请求的当前安全上下文.

启用角色管理(请参阅角色)后,RoleManagerModule会将RolePrincipal对象分配给Current HttpContext的User属性.

RolePrincipal类公开当前HTTP请求的安全标识,并另外执行角色成员资格检查.如果CacheRolesInCookie为true,则RolePrincipal对象管理缓存的角色列表,并首先在缓存列表中查找当前用户的角色成员资格,然后查找角色Provider.如果CacheRolesInCookie为false,则RolePrincipal对象始终使用角色提供程序查找角色成员身份.

希望有所帮助.