2009-12-15 77 views
2

我正在使用多个角色提供程序,标准SQL提供程序加上一个自定义的提供程序。在Global.asax中 - RoleManager_GetRoles我为那些应该使用自定义提供程序并将提供程序名称设置为我的自定义提供程序的用户创建RolePrincipal,并让其他用户按正常方式处理。Roles.GetRolesForUser仅调用默认角色提供者?

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

我已经解决了它,而不是枚举角色提供程序并在提供程序上调用GetRolesForUser()与RolePrincipal具有匹配的名称,但在我看来,Roles.GetRolesForUser()应该在默认情况下执行此操作。

我错过了什么吗?

回答

5

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

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

区别在于显式RolePrincipal定义了用户和提供者之间的关系,而角色只是角色提供者的管理对象,并且没有其他信息,只会使用默认提供者。从documentation for RolePrincipal

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

启用角色管理(见 角色)时,RoleManagerModule分配 一个RolePrincipal对象到当前的用户 财产的HttpContext。

RolePrincipal类公开当前HTTP 请求的 安全身份,并另外执行 检查角色成员身份。如果 CacheRolesInCookie是真实的,那么 RolePrincipal对象管理角色的 缓存列表和查找角色 成员在 缓存列表中的当前用户,再作用 提供商。如果CacheRolesInCookie为 为false,则RolePrincipal对象始终为 将使用 角色提供程序查找角色成员资格。

希望有所帮助。

+0

这是有道理的,并匹配我看到的行为。不幸的是,我正在处理大量使用Roles.GetRolesForUser()的预先存在的代码。 我猜是重新分解的时间。谢谢。 – Eddie 2009-12-15 18:07:05

+0

没问题。如果你得到的答案对你有帮助,你应该可以随时加注。 ;) – womp 2009-12-15 18:41:18

相关问题