【问题标题】:Roles.GetRolesForUser calls default role provider only?Roles.GetRolesForUser 仅调用默认角色提供程序?
【发布时间】:2010-12-26 21:46:21
【问题描述】:

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

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

我已经通过枚举角色提供者并在具有与 RolePrincipal 匹配的名称的提供者上调用 GetRolesForUser() 来解决它,但在我看来 Roles.GetRolesForUser() 应该默认这样做。

我错过了什么吗?

【问题讨论】:

    标签: asp.net roles


    【解决方案1】:

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

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

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

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

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

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

    希望对您有所帮助。

    【讨论】:

    • 这是有道理的,并且符合我所看到的行为。不幸的是,我正在处理大量使用 Roles.GetRolesForUser() 的现有代码。我猜是时候进行重构了。谢谢。
    • 没问题。如果您得到对您有帮助的答案,您应该随时为他们投票。 ;)
    猜你喜欢
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 2015-07-28
    • 2013-05-27
    • 2011-06-02
    • 1970-01-01
    相关资源
    最近更新 更多