Sitecore 針對外部成員數據庫對使用者進行身份驗證
我有一個 Sitecore 站點,我希望將網站訪問者帳戶儲存在外部 asp.net 會員數據庫中,但通過 Sitecore 界面管理 Sitecore 內容編輯器/管理員(因此儲存在“核心”數據庫中)。
我已閱讀以下論壇文章 http://sdn.sitecore.net/SDN5/Forum/ShowPost.aspx?postid=35305
其中提到了以下文件 http://sdn.sitecore.net/upload/sitecore6/62/membership_providers_sc62-a4.pdf http://sdn.sitecore.net/upload/sitecore6/62/security_api_cookbook_sc60-62-a4。 PDF http://sdn.sitecore.net/upload/sdn5/modules/ad/low-level_sitecore_cms_security_and_custom_providers-a4.pdf
但這些似乎都沒有提供我需要做什麼的完整畫面。
我目前已將該
<membership>部分設置為使用“切換器”提供程序(相應的提供程序指向我的會員數據庫),並且該<roleManager>部分還設置為再次使用切換器提供程序,相應的提供程序指向所述會員數據庫。到目前為止,我只成功地破壞了 Sitecore 桌面中的使用者管理器(
Item has already been added. Key in dictionary: 'extranet\Anonymous' Key being added: 'extranet\Anonymous'如果 Sitecore 創建了 extranet\Anonymous 帳戶,或者Object reference not set to an instance of an object.我刪除了該使用者帳戶,則會引發異常。作為背景資訊,我使用的是 Sitecore 6.5,我的網路配置的相關部分如下
<membership defaultProvider="switcher"> <providers> <clear/> <add name="sitecore" type="Sitecore.Security.SitecoreMembershipProvider, Sitecore.Kernel" realProviderName="myProvider" providerWildcard="%" raiseEvents="true"/> <add name="sql" type="System.Web.Security.SqlMembershipProvider" connectionStringName="core" applicationName="sitecore" minRequiredPasswordLength="1" minRequiredNonalphanumericCharacters="0" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="256"/> <add name="switcher" type="Sitecore.Security.SwitchingMembershipProvider, Sitecore.Kernel" applicationName="sitecore" mappings="switchingProviders/membership"/> <add name="myProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" applicationName="sitecore" connectionStringName="myDatabase" minRequiredPasswordLength="1" minRequiredNonalphanumericCharacters="0" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="10" /> </providers> </membership> <roleManager defaultProvider="switcher" enabled="true"> <providers> <clear/> <add name="sitecore" type="Sitecore.Security.SitecoreRoleProvider, Sitecore.Kernel" realProviderName="myProvider" raiseEvents="true"/> <add name="sql" type="System.Web.Security.SqlRoleProvider" connectionStringName="core" applicationName="sitecore"/> <add name="switcher" type="Sitecore.Security.SwitchingRoleProvider, Sitecore.Kernel" applicationName="sitecore" mappings="switchingProviders/roleManager"/> <add name="myProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" applicationName="sitecore" connectionStringName="myDatabase" /> </providers> </roleManager>
在自定義成員資格/角色提供者的情況下,您應該遵循的想法類似於AD 模組在其設置說明中列出的內容。整個過程可以分為幾個步驟:
- 將連接字元串添加到 connectionstrings.config
- 將成員資格/角色提供者定義添加到 web.config 的 system.web 部分
- 啟動切換器
- 從自定義提供程序為使用者/角色創建一個新域
- 添加域/提供商映射
添加連接字元串
這很簡單,似乎這就是您已經完成的。關鍵是要有一個到數據庫的連接字元串,然後您可以從自定義提供程序中引用。
添加成員資格/角色提供者定義
另一個簡單的步驟 - 只需在 web.config 的部分下添加成員資格提供者定義(
myProvider在您的情況下) ,然後在部分下添加角色提供者定義。順序並不重要。此時,您無需修改上述部分中的任何其他提供程序定義。system.web/membership/providers``system.web/roleManager/providers啟動切換器
這就是它變得複雜的地方。首先,不要更改
@defaultProvider屬性值。預設情況下,它'sitecore'應該保持原樣。相反,找到名為 的提供程序"sitecore",並將其@realProviderName屬性值從更改'sql'為'switcher'。名為“switcher”的提供者負責切換提供者和組合 GetAll/Find 方法的結果背後的所有魔法。
創建一個新域
您應該為您將通過自定義提供程序從自定義數據庫中獲取的使用者/角色創建一個新域。像這樣的東西:
<domain name="myDomain" ensureAnonymousUser="false"/>設置為 false的
@ensureAnonymousUser屬性意味著 Sitecore 不會將匿名使用者添加到您的域,因此不會有myDomain\Anonymous. 這通常是自定義域所需的行為。添加域/提供商映射
這是讓 Sitecore 知道每個提供商為哪個域提供服務的最後一步。一個提供程序可以處理多個域(預設的 Sitecore SQL 提供程序儲存來自“sitecore”和“extranet”域的使用者),但反之則不行。
因此,打開主 web.config 文件並瀏覽到該
configuration/sitecore/switchingProviders部分。為會員小節添加類似的內容:<provider providerName="myProvider" storeFullNames="false" wildcard="%" domains="myDomain" />以及 roleManager 小節的類似內容:
<provider providerName="myProvider" storeFullNames="false" wildcard="%" domains="myDomain" />在此之後,您數據庫中的使用者將像
'myDomain\user'在 UserManager 中一樣可見,角色也是如此。這@storeFullNames='false'意味著您的數據庫儲存沒有域前綴的使用者/角色,只是本地名稱。如果您的自定義源是 SQL(顯然是),萬用字元應該是預設值。就是這樣,現在它應該可以工作了!:-) 上述步驟的詳細資訊在本文中進行了描述。