2008-12-12 7 views
3

Dans un fournisseur de rôle personnalisé (héritant de RoleProvider) dans .NET 2.0, la méthode IsUserInRole a été codé en dur pour revenir toujours vrai:Roles.IsUserInRole se comporte-t-il comme prévu dans le scénario simple suivant?

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

Dans une application ASP.NET configuré pour utiliser ce fournisseur de rôle, le code suivant renvoie vrai (comme prévu):

Roles.IsUserInRole("any username", "any rolename"); // results in true 

Cependant, le code suivant retourne false:

Roles.IsUserInRole("any rolename"); // results in false 

N Notez que User.IsInRole ("any rolename") retourne aussi false.

  1. Est-ce le comportement attendu?
  2. Est-il incorrect de supposer que la surcharge qui prend uniquement un nom de rôle appelle toujours le IsUserInRole surchargé?

Mise à jour: Notez qu'il ne semble pas être un remplacement disponible pour la version qui prend une seule chaîne, ce qui a conduit à mon hypothèse dans # 2.

Répondre

3

J'ai regardé Roles.IsUserInRole (string rolename) dans le réflecteur .net, et il décide de ce qui suit:

public static bool IsUserInRole(string roleName) 
{ 
    return IsUserInRole(GetCurrentUserName(), roleName); 
} 

je prendrais un coup d'oeil à votre utilisateur actuel. Voici pourquoi:

private static string GetCurrentUserName() 
{ 
    IPrincipal currentUser = GetCurrentUser(); 
    if ((currentUser != null) && (currentUser.Identity != null)) 
    { 
     return currentUser.Identity.Name; 
    } 
    return string.Empty; 
} 

je serais prêt à parier cela retourne une chaîne vide soit parce que vous ne disposez pas d'un utilisateur actuel, ou son nom est une chaîne vide ou nulle.

Dans la méthode IsUserInRole(string username, string roleName), il y a le bloc de code suivant tout près du début:

if (username.Length < 1) 
    { 
     return false; 
    } 

Si votre GetCurrentUserName() ne retourne pas quelque chose de significatif, il retournera faux avant d'appeler votre méthode surchargée.

moral à emporter de ceci: réflecteur est un excellent outil :)

+0

Très appréciée! J'ai téléchargé l'outil Reflector maintenant, merci de me l'indiquer. Vous aviez raison sur le nom d'utilisateur étant vide, j'utilise l'authentification anonyme, résultant en l'identité System.Security.Principal.GenericIdentity qui se trouve avoir un attribut Name vide. –

+0

Ouais, j'ai tendance à compter sur le réflecteur plus que sur la propre documentation de Microsoft :) –

0

Aussi méfiez-vous si vous avez sélectionné cacheRolesInCookie = « true » dans la configuration roleManager. Si vous avez ajouté un nouveau rôle à la base de données, il se peut que ce soit la version mise en cache dans le cookie.

J'ai rencontré ce problème et la solution était de supprimer le cookie et de me reconnecter.

0

Cela peut aider quelqu'un - être conscient:

Si vous utilisez le contrôle de connexion pour authentifier - le nom d'utilisateur est entré dans le contrôle devient le HttpContext.Current.User.Identity.Name qui est utilisé dans les rôles. IsUserInRole (string rolename) et plus spécifiquement - la méthode GetUser() de l'appartenance. Si tel est le cas, assurez-vous de remplacer l'événement Authenticate, de valider l'utilisateur dans cette méthode et de définir le nom d'utilisateur sur une valeur que votre fournisseur d'appartenance personnalisé peut utiliser.

protected void crtlLoginUserLogin_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    bool blnAuthenticate = false; 
    string strUserName = crtlLoginUserLogin.UserName; 

    if (IsValidEmail(strUserName)) 
    { 

     //if more than one user has email address - must authenticate by username. 

     MembershipUserCollection users = Membership.FindUsersByEmail(strUserName); 
     if (users.Count > 1) 
     { 
      crtlLoginUserLogin.FailureText = "We are unable to determine which account is registered to that email address. Please enter your Username to login."; 

     } 
     else 
     { 
      strUserName = Membership.GetUserNameByEmail(strUserName); 
      blnAuthenticate = Membership.ValidateUser(strUserName, crtlLoginUserLogin.Password); 

      //setting the userLogin to the correct user name (only on successful authentication) 
      if (blnAuthenticate) 
      { 
       crtlLoginUserLogin.UserName = strUserName; 
      } 

     } 


    } 
    else 
    { 
     blnAuthenticate = Membership.ValidateUser(strUserName, crtlLoginUserLogin.Password); 
    } 

    e.Authenticated = blnAuthenticate; 

} 
Questions connexes