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

发布于 2024-08-15 03:17:31 字数 504 浏览 3 评论 0原文

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

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

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

我错过了什么吗?

I'm using multiple role providers, the standard SQL provider plus a custom one. Inside Global.asax - RoleManager_GetRoles I create a RolePrincipal for users that should use my custom provider with the provider name set to my custom provider, and let other users be handled as normal.

This almost works, asp.net allows access to pages protected via the web.config and calls my provider to get the list of roles. However, when I call Roles.GetRolesForUser() inside my code it only seems to invoke the default role provider, not my custom provider. If I set my custom provider to be the default, then it is invoked, but only it is ever invoked.

I've worked around it by instead enumerating the role providers and calling GetRolesForUser() on the provider with a matching name to the RolePrincipal, but it seems to me that Roles.GetRolesForUser() should be doing that by default.

Am I missing something?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

恋你朝朝暮暮 2024-08-22 03:17:31

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

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

不同之处在于,显式 RolePrincipal 定义了用户和提供者之间的关系,而 Roles 只是角色提供者的管理对象,在没有其他信息的情况下,将仅使用默认提供者。来自 RolePrincipal 文档

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

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

RolePrincipal 类公开
当前 HTTP 的安全身份
请求并另外执行
检查角色成员资格。如果
CacheRolesInCookie 为 true,则
RolePrincipal 对象管理
缓存的角色列表并查找角色
当前用户的成员资格
首先是缓存列表,然后是角色
提供者。如果 CacheRolesInCookie 是
false,RolePrincipal 对象始终
使用以下命令查找角色成员资格
角色提供者。

希望有帮助。

The RoleManager and RolePrincipal are different objects for different purposes.

I think what you want to be using is a call to GetRoles() on your RolePrincipal instance, rather than Roles.GetRolesForUser().

The difference is that an explicit RolePrincipal is defining the relationship between a user and a provider, whereas Roles is just a management object for role providers, and given no other information, will just use the default provider. From the documentation for RolePrincipal:

The RolePrincipal object implements
the IPrincipal interface and
represents the current security
context for the HTTP request.

When role management is enabled (see
Roles), the RoleManagerModule assigns
a RolePrincipal object to the User
property of the Current HttpContext.

The RolePrincipal class exposes the
security identity for the current HTTP
request and additionally performs
checks for role membership. If
CacheRolesInCookie is true, then the
RolePrincipal object manages the
cached list of roles and looks up role
membership for the current user in the
cached list first, then the role
Provider. If CacheRolesInCookie is
false, the RolePrincipal object always
looks up role membership using the
role provider.

Hope that helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文