我有一个Sitecore网站,我希望将网站访客帐户存储在外部asp.net会员数据库中,但保持Sitecore内容编辑/管理员通过Sitecore界面进行管理(因此存储在'Core'数据库中)。 / p>
我已阅读以下论坛帖子 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>
部分也设置为使用切换器提供者再次与指向所述会员DB的相应提供者。
到目前为止,我只是成功打破了Sitecore桌面中的用户管理器(如果Sitecore创建了外联网\匿名帐户,它会抛出异常Item has already been added. Key in dictionary: 'extranet\Anonymous' Key being added: '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>
答案 0 :(得分:20)
在自定义成员资格/角色提供程序的情况下,您应该遵循的想法与AD module中its setup instructions列出的内容类似。整个过程可分为几个步骤:
这非常简单,看来这就是你已经完成的事情。关键是要有一个到数据库的连接字符串,然后可以从自定义提供程序引用。
另一个简单步骤 - 只需在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"/>
@ensureAnonymousUser
属性设置为false表示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" />
此后,您的数据库中的用户将在UserManager中显示为'myDomain\user'
,角色也是如此。 @storeFullNames='false'
表示您的数据库存储的用户/角色没有域前缀,只有本地名称。如果自定义源是SQL(显然是),则通配符应该是默认值。
就是这样,现在应该可以了! :-)上述步骤的详细信息在this article中描述。