我目前正在处理一个 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 时指定要轮询的身份验证提供程序,以便我可以保证将正确的用户添加到站点?