SharePoint 2019 使用活动目录的基于自定义表单的身份验证 "site not shared with you"

SharePoint 2019 custom form based authentication using active directory "site not shared with you"

我想实现的成就是我想创建一个自定义登录页面 (FBA) 来验证活动目录中的用户。用户获得了两个具有受信任域林的域,因此来自两个 AD 的用户都可以登录。目前我正在使用以下方法:

我创建了一个自定义页面来登录 SharePoint 2019,登录页面中的代码使用以下行来验证用户:

        SecurityToken token = SPSecurityContext.SecurityTokenForFormsAuthentication
                                         (new Uri(SPContext.Current.Web.Url),
                                         "admembers",
                                         "",
                                         _userName,
                                         _password,
                                         (SPFormsAuthenticationOption) 0);
        SPFederationAuthenticationModule.Current.SetPrincipalAndWriteSessionToken(token);

以上几行来自linkhttps://sharepoint.stackexchange.com/questions/42541/how-to-create-a-custom-fba-login-page-that-forces-user-to-change-password-and-vi

我按照本指南http://davidmsterling.blogspot.com/2013/05/setting-up-forms-based-authentication.html(该网站适用于 SharePoint 2010,但我找不到太多适用于 SharePoint 2019 的内容)来设置 FBA

主要是我改了3个web.configs:

  1. 网站申请web.config
  2. 中央行政web.config
  3. 安全令牌服务web.config

安全令牌服务:

对于安全令牌服务 web.config 我在末尾添加了以下代码:

      <connectionStrings>
            <add name="adconn"
                   connectionString="LDAP://Sharepoint2019.int/DC=Sharepoint2019,DC=int" />
      </connectionStrings>
      <system.web>
            <membership defaultProvider="admembers">
                  <providers>
                        <add name="admembers"
                               type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                               connectionStringName="adconn"
                               enableSearchMethods="true"
                               attributeMapUsername="sAMAccountName" />
                  </providers>
            </membership>
      </system.web>

中央管理:

对于中央管理 web.config 我在“</SharePoint>”标签后添加了以下代码:

      <connectionStrings>
            <add name="adconn"
                   connectionString="LDAP://Sharepoint2019.int/DC=Sharepoint2019,DC=int" />
      </connectionStrings>

我还将以下代码添加到“PeoplePickerWildCards”节点

<add key="admembers" value="%" />

此外,我将默认会员标签修改为以下

            <membership defaultProvider="admembers">
                  <providers>
                        <add name="admembers"
                               type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                               connectionStringName="adconn"
                               enableSearchMethods="true"
                               attributeMapUsername="sAMAccountName" />
                  </providers>
            </membership>

站点申请:

对于站点应用程序,我添加了以下代码

 <connectionStrings>
    <add name="adconn" connectionString="LDAP://Sharepoint2019.int/DC=Sharepoint2019,DC=int" />
  </connectionStrings>

此外,我已将以下代码添加到“PeoplePickerWildcard”

<add key="admembers" value="%" />

此外,我将以下代码添加到会员提供程序中:

                        <add name="admembers"
                               type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
                               connectionStringName="adconn"
                               enableSearchMethods="true"
                               attributeMapUsername="sAMAccountName" />

然后在中央管理中,我选择了 Web 应用程序,启用了表单身份验证,将默认会员提供程序名称设置为“admembers”并将自定义登录页面指向“_layout\LoginPage\login.aspx”

结果:

结果是我能够使用农场管理员帐户(网站所有者)登录该网站。但是,出现“网站尚未与您共享”的错误消息。

我已经通过以下代码测试了 LDAP 路径: var ldapPath = "DC=corp,DC=ad,DC=example,DC=com";

using (var entry = new DirectoryEntry($"LDAP://Sharepoint2019.int/DC=Sharepoint2019,DC=int"))  {
    using(var searcher = new DirectorySearcher(entry)) {
        searcher.Filter = "(&(objectClass=user)(sAMAccountName=spAdministrator*))";
        SearchResultCollection result = searcher.FindAll();
        
    }
}

结果是能够找到那个用户

有没有人有任何建议我做错了或者我使用了正确的方法?

您似乎需要转到托管此登录页面的站点的站点权限,并使用检查权限来查看您尝试登录的用户是否具有查看该站点的权限。

我已经从 Microsoft 确认默认的基于表单的身份验证不能以这种方式工作,默认的基于表单的身份验证仅适用于用户策略中设置的用户。

无法对多个区域使用基于默认表单的身份验证和 windows 身份验证。多种身份验证方法导致多个 SharePoint 用户配置文件,这不是我们想要的。

最后集成了Azure active directory来满足表单认证需求。