我目前正在从事一个SharePoint 2010项目,该项目使用基于声明的身份验证设置了SharePoint Web应用程序。Web应用程序是在端口8081上创建的,使用Windows身份验证进行身份验证,并使用基于表单的身份验证扩展到端口80。
表单身份验证提供程序设置为使用与Windows身份验证基础站相同的活动目录,使用以下条目在应用程序的web.config文件中(这些条目也在中央管理和安全令牌服务的web.config文件中):
使用此设置按预期工作; 访问端口8081上的应用程序的用户将被呈现标准的Windows身份验证挑战,而访问端口80的用户则会被重定向到自定义登录表单。通过开箱即用的管理工具向站点添加用户时,搜索特定用户(例如john.smith@mydomain.com)将返回两个结果,一个来自Windows身份验证提供程序,另一个来自Forms身份验证提供程序。向站点添加这两个用户会发现SharePoint将帐户名存储在前面附加了标识符的形式。Windows身份验证用户转换为i:0#.w|mydomain\johnsmith,FBA用户转换为i:0#.f|fba_ad_mp|john.smith@mydomain.com。
这就是问题所在。我们正在使用自定义构建的工具批量创建网站集,该工具解析输入的电子表格,创建网站集,并使用以下方法向新创建的站点添加适当的用户:
表单身份验证提供程序设置为使用与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身份验证提供程序,另一个来自Forms身份验证提供程序。向站点添加这两个用户会发现SharePoint将帐户名存储在前面附加了标识符的形式。Windows身份验证用户转换为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()));
}
}
传递的userName参数是john.smith@mydomain.com,但是添加到站点中的用户始终是基于Windows身份验证的用户i:0#.w|mydomain\johnsmith,根据示例。
我如何指定在调用EnsureUser时轮询哪个身份验证提供程序,以便确保将正确的用户添加到站点中?