Я в настоящее время работаю над проектом SharePoint 2010 года, где среда является установкой с веб-приложением SharePoint с помощью основанной на требованиях аутентификации. Веб-приложение создается на порте 8 081 аутентификация Windows использования для автора и расширяется для портирования 80 Аутентификации на основе форм использования.
Поставщик аутентификации форм является установкой для использования того же активного каталога в качестве окон основанный на авторе сайт, с помощью следующих записей в 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, дарят стандартную проблему автора окон, пользователи на порте 80, направлены к пользовательской форме входа в систему. При добавлении пользователей к сайту через из административных средств поля, поиск конкретного пользователя, таких как john.smith@mydomain.com возвратит два хита, один от поставщика автора окон, один от поставщика автора форм. Добавление обоих из этих пользователей на сайт показывает, что SharePoint снабжает имя учетной записи идентификатором, добавленным к передней стороне. Пользователь автора окон переводится в 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. Однако пользователь, добавленный к сайту, всегда является окнами основанный на авторе пользователь, i:0#.w|mydomain\johnsmith.
Как я указываю, какого поставщика аутентификации опросить при вызове EnsureUser, таким образом, я могу гарантировать, что корректный пользователь добавляется к сайту?
Проблема в том, что оба поставщика членства распознают адрес электронной почты, и используется первый результат (AD). Попробуйте (скрыто) - этот синтаксис работает в стандартных элементах управления именем пользователя (с использованием имени проверки, а не диалогового окна поиска), и я считаю, что EnsureUser работает таким же образом.