2009-12-14 4 views
2

J'ai un site WSS 3.0 (sans MOSS) qui utilise un fournisseur d'appartenances d'authentification de formulaires et un gestionnaire de rôles, authentifiant les utilisateurs par rapport à un service Web distant (bien qu'au contraire moq data). Mon problème est le suivant: les utilisateurs qui se connectent ont leur nom affiché comme étant leur nom de connexion, pas leur nom complet.Nom d'affichage FBA avec fournisseur d'appartenance personnalisé, WSS 3.0

J'ai configuré mon fournisseur de sorte que le nom d'utilisateur et le nom complet soient stockés, et que lorsque demandé (par exemple GetUserByUsername), l'une ou l'autre valeur renvoie un objet MembershipUser avec le nom complet comme nom d'utilisateur. Cela a pour effet que dans le sélecteur de personnes sharepoint, la saisie d'un nom d'utilisateur aboutit à l'auto-complétion en le transformant en son nom complet, un peu comme le fait Windows authentiques. Toutefois, en point d'arrêt du fournisseur, lorsque vous vous connectez au site, seule la méthode ValidateUser sur le fournisseur est appelée, il ne s'agit jamais d'une requête pour mes objets MembershipUser trafiqués. En regardant la table UserInfo dans la base de données de contenu, une nouvelle entrée est créée avec le nom d'utilisateur (tp_title) défini sur leur nom de connexion. À court d'exécuter une requête directe sur la base de données (ce que je ne vais pas faire), je ne sais pas comment je peux avoir un nom d'utilisateur convivial pour les utilisateurs FBA personnalisés. L'aide serait appréciée.

Répondre

2

Nevermind, trouvé un moyen de contourner le problème. Sur la méthode de validation de mon fournisseur d'appartenance personnalisée, le code suivant me permet de définir la propriété name. Cela pourrait ne pas l'échelle lorsque vous utilisez des milliers d'utilisateurs, mais pour les bases de petites utilisateurs, il devrait être bien:

public override bool ValidateUser(string username, string password) 
    { 
     if (moqUsers.Any(user => user.Username.Equals(username) && user.Password.Equals(password))) 
     { 
      SPContext.Current.Site.RootWeb.AllowUnsafeUpdates = true; 
      var user = SPContext.Current.Site.RootWeb.EnsureUser(username); 
      user.Name = RetrieveUserFullName(username); 
      user.Update(); 
      SPContext.Current.Site.RootWeb.AllowUnsafeUpdates = false; 
      return true; 
     } 
     return false; 
    } 

En outre, il faudrait peut-être une bonne disposition des rootweb dans ce qui précède.

+0

Je fais la même chose tout en ajoutant l'utilisateur à SharePoint. – Kusek

0

J'ai essayé beaucoup pour obtenir le code ci-dessus pour travailler pendant ValidateUser, qui je pense est un moment idéal pour mettre à jour UserInfo.tp_Title (sauf peut-être le fait que vous allez mettre à jour chaque fois que le utilisateur se connecte, mais hey, qu'allez-vous faire?).

Cependant, je n'ai pas pu obtenir EnsureUser pour fonctionner (aussi essayé AllUsers[]) sans erreurs de lancement. J'ai essayé d'exécuter au sein d'un délégué anonyme sous SPSecurity.RunWithElevatedPrivileges et tous. Pas de dé.

La chose est, cependant, que je pense que cela est tout à fait la bonne idée, et je veux juste partager la façon dont je l'ai eu de travail est par un appel au service Web SP UserGroup (/_vti_bin/usergroup.asmx), appelant UpdateUserInfo. La signature de méthode exacte pour moi ressemble à quelque chose comme:

UserGroup.UpdateUserInfo("custommembershipprovidername:" + username, TheFullName, 
emailAddress, string.Empty) 
Questions connexes