2009-09-16 3 views
3

J'ai une application .Net qui utilise un nombre arbitraire de fournisseurs d'appartenance. Je ne vais pas entrer dans les raisons, mais je ne veux pas qu'ils soient préconfigurés, mais je veux les créer et les ajouter par programmation. Est-ce qu'il y a un moyen de faire ça? Je n'ai aucun problème à créer les fournisseurs, mais Membership.Providers est en lecture seule, donc je ne peux pas les ajouter.Ajout d'un fournisseur d'appartenance par programme

Répondre

1

Un hack facile consiste à créer un fournisseur d'appartenance personnalisé (en tant que wrapper) en premier et à l'accrocher dans web.config. Ensuite, vous implémentez ce fournisseur pour pouvoir authentifier les utilisateurs par rapport à une liste de fournisseurs d'appartenances réels.

Étant donné que l'emballage vous appartient, vous n'êtes limité que par votre imagination.

6

tardive, réponse tardive, mais vous pouvez utiliser la réflexion:

public static class ProviderUtil 
{ 
    static private FieldInfo providerCollectionReadOnlyField; 

    static ProviderUtil() 
    { 
     Type t = typeof(ProviderCollection); 
     providerCollectionReadOnlyField = t.GetField("_ReadOnly", BindingFlags.Instance | BindingFlags.NonPublic); 
    } 

    static public void AddTo(this ProviderBase provider, ProviderCollection pc) 
    { 
     bool prevValue = (bool)providerCollectionReadOnlyField.GetValue(pc); 
     if (prevValue) 
      providerCollectionReadOnlyField.SetValue(pc, false); 

     pc.Add(provider); 

     if (prevValue) 
      providerCollectionReadOnlyField.SetValue(pc, true); 
    } 
} 

Ensuite, dans votre code, vous pouvez faire quelque chose comme ceci:

MyMembershipProvider provider = new MyMembershipProvider(); 
NameValueCollection config = new NameValueCollection(); 
// Configure your provider here. For example, 
config["username"] = "myUsername"; 
config["password"] = "myPassword"; 
provider.Initialize("MyProvider", config); 

// Add your provider to the membership provider list 
provider.AddTo(Membership.Providers); 

Il est un hack, parce que nous sommes en utilisant la réflexion pour définir le champ privé "_ReadOnly", mais cela semble fonctionner.

Voici un post sur cette question: http://elegantcode.com/2008/04/17/testing-a-membership-provider/

Une autre bonne après: http://www.endswithsaurus.com/2010/03/inserting-membershipprovider-into.html

Portez une attention particulière aux mises en garde de l'utilisation _ReadOnly dans ces messages, que vous aurez envie de peser les inconvénients de manipuler une collection en lecture seule par rapport aux exigences de votre projet et ce que vous essayez d'accomplir.

Cordialement,

-Doug

+0

Très utile. J'utilise ceci pour des tests unitaires sur un fournisseur d'appartenance personnalisé. – jsalwen

+0

Ceci est un hack sale, sale ... qui fonctionne, malgré ma profonde honte pour l'utiliser. Merci pour ça. – Deane

0

Je sais que déjà hors de propos, mais pour les futurs lecteurs, je vais ajouter ma solution à un problème similaire. J'ai voulu créer un fournisseur qui ajouterait des fonctionnalités sur n'importe quel autre fournisseur (modèle de décorateur), donc je voulais ajouter le fournisseur interne à la collection des fournisseurs (pour celui au-dessus de moi - ça ne marchera pas, parce que si le fournisseur n'est pas dans la collection de fournisseurs - il ne sera pas capable de créer des utilisateurs).

Je n'ai pas aimé la solution de réflexion pour deux raisons:

La plus évidente - il casse l'encapsulation. Le deuxième - le code devrait fonctionner sans autorisation de réflexion, sinon, n'importe quel morceau de code serait capable d'ajouter son propre fournisseur - donc toute sécurité serait compromise.

La solution (simple) que j'ai trouvée consistait à enregistrer les deux fournisseurs dans web.config, à définir le fournisseur par défaut sur mon fournisseur et à charger le second fournisseur à l'exécution à partir de la collection des fournisseurs.

Pour la première question - si vous pouvez savoir quels fournisseurs vous aurez besoin avant l'exécution, il serait préférable de les enregistrer dans web.config, et peut-être modifier leurs propriétés en cours d'exécution.

Une autre solution (qui serait encore "correcte", mais lente) serait de déléguer le contrôle de sécurité à un petit exe, de changer son application.config, exécutez-le et renvoyez le résultat sous la forme d'une sortie (votre fournisseur peut le faire). DPAPI peut fournir la sécurité pour la livraison de mot de passe.

Questions connexes