2009-09-16 62 views
3

我有一個使用任意數量的成員資格提供程序的.Net應用程序。我不會介紹原因,但我不希望這些是預配置的,但我想創建並以編程方式添加它們。無論如何要做到這一點?我創建提供程序沒有問題,但Membership.Providers是隻讀的,所以我不能添加它們。以編程方式添加成員資格提供程序

回答

1

一個簡單的黑客是先創建一個自定義的成員提供(如包裝),並把它掛在web.config中。然後,您實現此提供程序,以便能夠根據真實會員提供商列表對用戶進行身份驗證。

由於包裝是由你擁有的,你只限於你的想象力。

6

晚,答案,但你可以使用反射:

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

然後,在你的代碼,你可以做這樣的事情:

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

這是一個黑客,因爲我們使用反射設置「_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 2011-07-25 07:42:38

+0

這是一個骯髒,骯髒的黑客......儘管我對使用它感到羞恥,但它仍然有效。這次真是萬分感謝。 – Deane 2018-02-22 15:51:28

0

我知道它已經無關緊要,但對於未來的讀者我會加入我的解決方案類似的問題。

我想創建一個提供者,它會在任何其他提供者(裝飾器模式)上添加一些功能,所以我想將內部提供者添加到提供者集合中(對於上面的那個 - 它不起作用,因爲如果提供者不在提供者集合中 - 它將無法創建用戶)。

我不喜歡思考的解決方案有兩個原因:

最明顯的一個 - 它打破封裝。

第二個 - 代碼應該沒有反射權限運行,否則,任何一段代碼就可以添加自己的供應商 - 因此,任何安全性將受到影響。

的(簡單的)解決方案,我發現在web.config中註冊這兩個供應商,設置默認的供應商我的供應商,並加載從供應商集合在運行時的第二供應商。

對於第一個問題 - 如果你能知道你將在運行前需要哪些供應商,倒不如在web.config中註冊它們,也許改變運行它們的屬性。

另一種解決方案(這將是仍是「正確的」,但慢)將委派安全檢查,以一個小的exe,改變它的應用程序。配置,運行它,並將結果作爲輸出返回(您的提供者可以這樣做)。 DPAPI可以提供密碼傳遞的安全性。

相關問題