2009-09-16 8 views
3

私は任意の数のメンバーシッププロバイダーを使用する.Netアプリケーションを持っています。私はその理由については考えませんが、これらを事前設定したくないのですが、プログラムで作成して追加したいのです。これを行うためにとにかくありますか?私はプロバイダの作成に問題はありませんが、Membership.Providersは読み取り専用ですので、追加することはできません。プログラムでメンバーシッププロバイダーを追加する

答えて

1

まず、カスタムメンバーシッププロバイダ(ラッパーとして)を作成してweb.configにフックします。次に、このプロバイダーを実装して、実際のメンバーシッププロバイダーのリストに対してユーザーを認証できるようにします。

ラッパーはあなたが所有しているため、あなたの想像力によってのみ制限されます。私たちがしているので、

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

それはハックです:

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

次に、あなたのコードでは、あなたがこのような何かを行うことができます。

6

後期、後期の答えは、しかし、あなたは、リフレクションを使用することができます反射を使用して "_ReadOnly"プライベートフィールドを設定しますが、動作するようです。 http://elegantcode.com/2008/04/17/testing-a-membership-provider/

もう一つの良いポスト:ここ

は、この問題についての素晴らしい記事だあなたは欠点を比較検討したいと思うよう http://www.endswithsaurus.com/2010/03/inserting-membershipprovider-into.html

は、これらの記事で_ReadOnlyを使用しての警告には特に注意してくださいあなたのプロジェクトの要件と達成しようとしているものとの間の読み取り専用コレクションを操作することです。

よろしく、

-Doug

+0

非常に役に立ちます。私はこれをカスタムメンバーシッププロバイダーの単体テストに使用しています。 – jsalwen

+0

これは汚い、汚れたハックです...それは、それを使用して私の深い残念にもかかわらず、動作します。これありがとう。 – Deane

0

私はそのすでに無関係を知っているが、将来の読者のために、私は同様の問題のために私の解決策を追加します。

他のプロバイダ(デコレータパターン)にいくつかの機能を追加するプロバイダを作成したかったので、内部プロバイダをプロバイダコレクションに追加したいと思っていました。プロバイダーがプロバイダーコレクションにない場合、ユーザーを作成できないためです)。

私は2つの理由で反射ソリューションを好きではなかった:

明白なものを - それはカプセル化を破ります。

コードはリフレクションパーミッションなしで実行する必要があります。それ以外の場合は、コード自体がプロバイダを追加できるため、セキュリティが侵害されます。

私が見つけた(簡単な)ソリューションは、両方のプロバイダをweb.configに登録し、デフォルトのプロバイダをプロバイダに設定し、プロバイダコレクションから実行時に2番目のプロバイダをロードすることでした。

最初の質問 - ランタイムの前に必要なプロバイダを知ることができれば、web.configでそれらを登録し、実行時にそのプロパティを変更する方がよいでしょう。

もう1つの解決方法(それでも「正しい」、しかし遅い)は、セキュリティチェックを小さなexeに委任し、アプリを変更することです。configを実行し、結果を出力として返します(プロバイダはこれを行うことができます)。 DPAPIはパスワード配信のセキュリティを提供できます。

関連する問題