IsUserInRole calls GetRolesForUser?

Josh picture Josh · Nov 2, 2010 · Viewed 9.9k times · Source

When I implement the RoleProvider class and call Roles.IsUserInRole(string username, string roleName), code execution first goes to the method 'GetRolesForUser(string username)'. Why is this? I don't want to iterate all roles when I am just looking for the single value of whether that user belongs in one role. Is this a limitation of .NET's role provider class or is there something I can do to control the execution of code a bit more?

Here's the calling code

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

And here's the implementation of IsUserInRole

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

But the code GetRolesForUser always gets implemented first:

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();
    }

Answer

user553838 picture user553838 · Dec 7, 2011

The RoleProvider.IsUserInRole(username, password) is used for checking roles for a given user which is not the current loggon user(for current logon user, it also use the Principal.IsInRole instead). And for RolePrincipal, it always use the GetRolesForUser to cache the roles and do the role checking among the cached role list. (source)

can user Roles.Provider.IsUserInRole instead of Roles.IsUserInRole