2013-01-03 89 views
1

我正在開發一個Intranet應用程序,並且已經與Active Directory成功集成。.net mvc與Active Directory的外鍵關係

當我們添加一個新客戶時,我想從下拉列表中指定一個客戶顧問。

我能夠使用填充下拉列表中選擇以下

PrincipalContext pc = new PrincipalContext(ContextType.Domain, "DOMAIN", "dc=domain,dc=org"); 
GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, "customerAdvisors"); 
ViewBag.Guid = new SelectList(group.Members, "Guid", "DisplayName"); 

我想,然後與數據庫中的客戶數據一起存儲所選用戶的GUID。

但是,我不確定如何在我的模型中設置外鍵約束,因爲我加入的表在Active Directory中。

我是否需要在我的數據庫中創建一個單獨的Employee表並同步所需的字段或者是否有簡化的方法?

+0

你能處理加載所有的顧問到內存和加入w/LINQ或什麼的列表 kenny

回答

1

我從來沒有這樣做過,但一些快速的研究使它看起來成爲可能。

您可以保存顧客的Guid指導給您的客戶。 AD Guid可以進入Guid數據類型。 You should be able to query individual users by using this method

UserPrincipal user = UserPrincipal.FindByIdentity(pc,yourUsersGuidAsAString);

不利的一面是,每當你想要你的客戶顧問的信息(如他們的姓名或電子郵件地址),你將不得不對AD做單獨的查詢。很難使用ORM。

在我的應用程序中,我有一個不同的用例,但我也將我的應用程序與AD集成。我採取的路線是將這些信息保存在我自己的數據庫中,而不是每次都打AD。在很大程度上,因爲我的架構很難以相同的方式到達AD。此外,使用ORM更容易(比如我的案例中的實體框架)來獲取我想要的信息。這樣做的缺點是你需要確保你的數據庫中的信息與AD中的內容保持一致。

您將不得不判斷哪種方法對您的架構/用例最有意義。

希望有所幫助。

+0

謝謝@Ben這基本上是我的解決方案,只是想知道是否有更好的方式來做到這一點。你如何保持你的數據同步。你有任何一個腳本嗎? – Stephen

+0

不幸的是。就像我說過的,我的用例和體系結構是不同的。在不涉及太多細節的情況下,我與AD的關係是間接的。我正在使用ADFS爲我的用戶執行聯合身份驗證。所以每次我的用戶登錄時,我都會根據AD向我發送的聲明更新他們的信息。我的網絡應用程序沒有直接訪問我的AD服務器。對於你的情況,也許你可以設置一些東西來定期輪詢AD(就像一個始終運行的windows服務,並且有一個每24小時執行一次的計時器線程) –

+0

非常感謝您的幫助。 – Stephen