IsUserInRole调用GetRolesForUser?

时间:2010-11-02 19:59:27

标签: c# .net roleprovider

当我实现RoleProvider类并调用Roles.IsUserInRole(字符串用户名,字符串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();
    }

2 个答案:

答案 0 :(得分:8)

  

RoleProvider.IsUserInRole(用户名,密码)用于检查给定用户的角色,该用户不是当前的loggon用户(对于当前登录用户,它也使用Principal.IsInRole)。对于RolePrincipal,它始终使用GetRolesForUser来缓存角色并在缓存的角色列表中执行角色检查。 (source

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

答案 1 :(得分:6)

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

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

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

UPDATE:在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?