Sitecore根据外部成员资格数据库验证用户身份

Mat*_*ser 9 asp.net asp.net-membership sitecore

我有一个Sitecore网站,我希望将网站访客帐户存储在外部asp.net会员数据库中,但保持Sitecore内容编辑/管理员通过Sitecore界面进行管理(因此存储在'Core'数据库中).

我已阅读以下论坛帖子 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>
Run Code Online (Sandbox Code Playgroud)

Yan*_*nko 20

在自定义成员资格/角色提供程序的情况下,您应遵循的想法与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"/>
Run Code Online (Sandbox Code Playgroud)

@ensureAnonymousUser属性设置为false意味着Sitecore不会向您的域添加匿名用户,因此不会myDomain\Anonymous.这通常是自定义域的所需行为.

添加域/提供程序映射

这是让Sitecore知道每个提供商提供哪个域的最后一步.一个提供商可以处理多个域(默认的Sitecore SQL提供商将用户存储在'sitecore'和'extranet'域中),但反之亦然.

因此,打开主web.config文件并浏览到该configuration/sitecore/switchingProviders部分.为成员子部分添加类似的内容:

<provider providerName="myProvider" storeFullNames="false" wildcard="%" 
domains="myDomain" />
Run Code Online (Sandbox Code Playgroud)

和roleManager子部分类似:

<provider providerName="myProvider" storeFullNames="false" wildcard="%" 
domains="myDomain" />
Run Code Online (Sandbox Code Playgroud)

在此之后,您的数据库中的用户将'myDomain\user'在UserManager中可见,对于角色也是如此.这@storeFullNames='false'意味着您的数据库存储没有域前缀的用户/角色,只有本地名称.如果您的自定义源是SQL(显然是),则通配符应该是默认值.

就是这样,现在应该可以了!:-) 本文描述了上述步骤的详细信息.

  • 尝试将其添加到/App_Config/Security/domains.config文件中 (2认同)