6

我目前正在处理一个 SharePoint 2010 项目,其中环境是使用基于声明的身份验证的 SharePoint Web 应用程序设置的。Web 应用程序使用 Windows 身份验证在端口 8081 上创建,并使用基于表单的身份验证扩展到端口 80。

表单身份验证提供程序设置为使用与基于 Windows 身份验证的站点相同的活动目录,在应用程序的 web.config 中使用以下条目(这些条目也在中央管理和安全令牌服务 web.config 文件中):

    <membership defaultProvider="i">
  <providers>
    <add name="i" type="Microsoft.SharePoint.Administration.Claims.SPClaimsAuthMembershipProvider, Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" />
    <add name="FBA_AD_MP" type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADFBAConnectionString" enableSearchMethods="true" attributeMapUsername="userPrincipalName" />
  </providers>
</membership>

使用此设置按预期工作;访问端口 8081 上的应用程序的用户会收到标准的 Windows 身份验证挑战,端口 80 上的用户会被定向到自定义登录表单。通过开箱即用的管理工具将用户添加到站点时,对特定用户(例如 john.smith@mydomain.com)的搜索将返回两个命中,一个来自 Windows 身份验证提供程序,一个来自表单身份验证提供程序。将这两个用户添加到网站后,SharePoint 会存储帐户名称,并在前面附加一个标识符。windows auth 用户翻译为 i:0#.w|mydomain\johnsmith,FBA 用户翻译为 i:0#.f|fba_ad_mp|john.smith@mydomain.com。

这就是问题所在。我们正在使用自定义构建的工具批量创建网站集,该工具解析输入电子表格,创建网站集,并使用以下方法将适当的用户添加到新创建的网站:

    private static void AddUser(SPSite site, String userName, String spGroupName)
    {
        try
        {
            SPUser spUser = site.RootWeb.EnsureUser(userName);

            if (spUser != null)
            {
                site.RootWeb.Groups[spGroupName].AddUser(spUser);
            }
        }
        catch(Exception ex)
        {
            SharePointManager.Counter.Warnings++;
            SharePointManager.Logger.Warn(String.Format("\t\tUnable to add user {0} to group {1} at site {2}: {3}", userName, spGroupName, site.RootWeb.Url, ex.ToString()));
        }
    }

传入的用户名参数是,按照示例,john.smith@mydomain.com。但是,添加到站点的用户始终是基于 Windows 身份验证的用户 i:0#.w|mydomain\johnsmith。

如何在调用 EnsureUser 时指定要轮询的身份验证提供程序,以便我可以保证将正确的用户添加到站点?

4

2 回答 2

1

问题是两个会员提供商都识别电子邮件地址,并且使用了第一个结果 (AD)。尝试 FBA_AD_MP:john.smith@mydomain.com - 该语法适用于标准用户名控件(使用检查名称而不是搜索对话框),我相信 EnsureUser 的工作方式相同。

于 2010-02-13T01:29:30.700 回答
0

简而言之,您需要使用 SPClaimProviderManager 将 SPUser 转换为 SPClaim

于 2010-09-19T10:28:58.557 回答