2011-08-26 112 views
4

在我的asp.net應用程序管理功能,我試圖結合AD身份驗證和表單授權來創建用戶,角色和分配用戶角色等我已配置MembershipADProvider和AspNetSqlMembershipProvider與我的web.config中的MembershipADProvider作爲默認值。用戶使用AD身份驗證登錄後,我需要切換/分配我的成員資格對象才能使用AspNetSqlMembershipProvider,以便從成員資格對象(從dbo.aspnet_Users表中)獲取所有用戶。如何在運行時切換提供程序?在尋找這個問題之後,我嘗試了不同的方法,但迄今爲止,這些方法都不適用於我。 這裏有幾個方法我嘗試: 1.的foreach(在Membership.Providers的MembershipProvider MP) { 如果(mp.Name == 「MembershipADProvider」) { Membership.Providers.Remove(MembershipADProvider「);
MembershipUserCollection用戶= Membership.GetAllUsers(); ddlUsers.DataSource =用戶; ddlUsers.DataBind();
斷裂; } }從AD成員資格提供程序切換到SQL成員資格提供程序

Membership.Providers.Remove(MembershipADProvider「); - 不起作用,因爲它不被支持。 此外,試圖清除Membership.Providers,然後添加只有類型的AspNetSqlMembershipProvider也不支持。

  1. 我無法與從 Membership.Providers [ 「AspNetSqlMembershipProvider」]值設置Membership.Provider作爲Membership.Provider是一個只讀屬性。

  2. 我試圖打開2個提供程序之間的連接字符串,它沒有提供提供程序,因爲它們都是不同類型的提供程序..如果兩個提供程序都是sqlserver提供程序,我相信這樣做會起作用。

請讓我知道,如果任何人已成功實施,或者如果這是一個似是而非的方法。謝謝!

回答

2

你會明確供應商傳遞到您的代碼,而不是承擔Memebership依賴直接(這只是包裝了一個在配置標記爲默認值)。在運行時不需要交換它們,請考慮這將如何影響線程安全。

所以與其說Membership.GetAllUsers();你會做這樣的事情(我沒有一個編譯器來手):

public UserSerivce : IUserService 
{ 
    private MembershipProvider provider; 

    public UserService(MembershipProvider provider) 
    { 
     this.provider = provider; 
    } 

    public IEnumerable<MembershipUser> GetUsers() 
    { 
     return provider.GetAllUsers(); 
    } 

    public void DoSomethingElseUseful() 
    { 
     ... 
    } 

} 

然後將它用於特定的供應商:

var service = new UserService(Membership.Providers["mySqlMembershipProvider"]); 
var users = service.GetUsers(); 

或者如果使用AD特定代碼:

var service = new UserService(Membership.Providers["myADMembershipProvider"]); 
var users = service.GetUsers(); 

以這種方式使用DI還有助於保持合作可測試的。

+0

感謝您的迴應,TheCodeKing!這種方法看起來更清潔,一旦工作。我曾嘗試過提到一個特定的提供者(在類中,而不是服務方法),就像 - Membership.Providers [「ASPNetSqlRoleProvider」]。GetAllUsers() - 但Provider.GetAllUsers()需要參數,如int pageIndex,int pageSize, out int totalRecords。 Membership.GetAllUsers()調用沒有參數的基函數。我嘗試傳遞參數像Provider.GetAllUsers(1,1,出val),但它沒有奏效。對此有何想法? –

+0

如果你看反射器'Membership.GetAllUsers()'只是調用'Membership.GetAllUsers(0,2147483647,out num)'。出於性能考慮,嘗試加載所有用戶可能不是一個好主意。最好查看結果。 – TheCodeKing

+0

我沒有在反射器中查看成員資格對象的GetAllUsers(),並且確實調用了Membership.GetAllUsers(0,2147483647,out num)。這並沒有讓我用確切的代碼打電話。現在,在您再次指出我嘗試使用users = Membership.Providers [「AspNetSqlMembershipProvider」]。GetAllUsers(0,2147483647,out val);它的工作!這可以用參數調用(0,2147483647,out val)嗎?但是,這確實有用!謝謝! –

0

如果您只需要aspnet_Users表中的用戶列表,只需使用System.Data.SqlClient對象連接到您的數據庫並查詢該表。沒有理由(您提到)需要使用成員資格提供者來獲取該數據。

話雖如此,您的會員資格/認證方案聽起來像它可能有一些設計問題,也許在不同的問題最好解決,但我認爲這可能是有用的,如果你想要評論你想要完成什麼總體上與多個會員供應商。

編輯:我發現一些使用多個會員供應商可能有用的帖子。看起來總體思路是在Login控件上實現處理Login.Authenticate事件的自定義代碼,並使用Membership.Providers["ProviderName"].ValidateUser來嘗試與每個提供者進行身份驗證。

http://www.stevideter.com/2008/03/20/using-two-membership-providers-for-aspnet-logins/ http://forums.asp.net/p/1112089/1714276.aspx

+0

感謝您的快速響應!我同意,我可以使用System.Data.SqlClient並查詢表來填充用戶列表。但是,我試圖用sqlserver提供程序來實現這一點,以保存一些工作..但如果這不是可能的話,那麼我可能不得不採取該路線。另外,如果我只是使用sqlserver提供程序進行登錄以及管理功能,那麼我也能夠實現這一點。 –

+0

感謝您的鏈接,我認爲我查了一下類似於前面的內容,其中談到了使用兩個提供者進行身份驗證相對容易。我早些時候嘗試這種方法MembershipProvider userProvider = Membership.Providers [「ASPNetSqlRoleProvider」]; userProvider.GetAllUsers(1,1,out val);哪些不起作用。 –

相關問題