【问题标题】:IsUserInRole calls GetRolesForUser?IsUserInRole 调用 GetRolesForUser?
【发布时间】:2011-05-04 03:44:20
【问题描述】:

当我实现 RoleProvider 类并调用 Roles.IsUserInRole(string username, string roleName) 时,代码执行首先转到方法“GetRolesForUser(string username)”。为什么是这样?当我只是在寻找该用户是否属于一个角色的单一值时,我不想迭代所有角色。这是 .NET 角色提供程序类的限制,还是我可以做些什么来控制代码的执行?

这是调用代码

if (Roles.IsUserInRole(CurrentUser.UserName, "Teacher")) {

这是 IsUserInRole 的实现

public override bool IsUserInRole(string username, string roleName) { return true; }

但 GetRolesForUser 代码总是先实现:

public override string[] GetRolesForUser(string username) {
        string[] roles = GetAllRoles();
        List<string> userRoles = new List<string>();
        foreach (string role in roles) {
            if (IsUserInRole(username, role)) {
                userRoles.Add(role);
            }
        }
        return userRoles.ToArray();
    }

【问题讨论】:

  • 很难看出这怎么可能,它是一种抽象方法。发布你的实现。

标签: c# .net roleprovider


【解决方案1】:

RoleProvider.IsUserInRole(username, password) 用于检查不是当前登录用户的给定用户的角色(对于当前登录用户,它也使用 Principal.IsInRole 代替)。而对于 RolePrincipal,它总是使用 GetRolesForUser 来缓存角色,并在缓存的角色列表中进行角色检查。 (source)

可以使用Roles.Provider.IsUserInRole 而不是Roles.IsUserInRole

【讨论】:

    【解决方案2】:

    Microsoft 的角色提供程序解决方案有一个层,可以在 cookie 中缓存用户的角色,因此它不需要调用提供程序的 GetRolesForUser 方法。我相信 cookie 缓存是 Roles 类的一部分,所以只要你从 RoleProvider 基类实现,它应该是兼容的。值得看一下反射器中的代码,以了解 MS 如何实现自己的抽象类,以及静态辅助类的作用(角色和成员资格)

    尝试将 cacheRolesInCookie="true" 添加到配置文件中的 roleManager 元素中,看看流程是否发生变化。

    由于您使用的是自己的 RoleProvider 实现,因此您还可以重写 IsUserInRole 方法并提供您自己的实现来检查用户是否在某个角色中。

    更新:此代码块在 Roles.IsUserInRole 方法中被调用:

    IPrincipal currentUser = GetCurrentUser();
    if (((currentUser != null) && (currentUser is RolePrincipal)) && ((((RolePrincipal) currentUser).ProviderName == Provider.Name) && StringUtil.EqualsIgnoreCase(username, currentUser.Identity.Name)))
    {
        flag = currentUser.IsInRole(roleName);
    }
    else
    {
        flag = Provider.IsUserInRole(username, roleName);
    }
    

    else 块将调用您的自定义提供程序的 IsUserInRole 方法。

    因此,您的用户的角色尚未添加到 Principal 对象中。如果你还没有走到那一步,好吧。如果没有,请确保您这样做。它将确保每次调用 Roles.IsUserInRole 或 User.IsInRole 时,这些函数将使用用户角色的内存缓存(一旦加载),而不必每次都访问数据库。 (尽管基础角色提供者和角色管理器类应该为您处理这个问题。)

    您能否验证角色提供者的配置文件设置?另外,您使用的是哪个版本的 .net?您是手动管理登录过程还是使用 .net 登录控件?您是否实现了自定义角色类?还是您使用的是 System.Web.Security.Roles?

    【讨论】:

    • 尝试在角色提供者上添加 cacheRolesInCookie="true" 仍然调用 GetRolesForUser。
    • 您找到解决方法了吗?如果我传入两个随机字符串,它将转到 InUserInRole,但如果我在用户名参数中传入我的活动目录,它会强制它为 GetRolesForUser!!
    猜你喜欢
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2013-02-02
    • 2021-08-17
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    相关资源
    最近更新 更多