Различайте пользователей Windows Auth и Forms Auth при аутентификации в том же AD с SharePoint 2010 с использованием проверки подлинности на основе утверждений

StackOverflow https://stackoverflow.com/questions/2255836

Вопрос

В настоящее время я работаю над проектом SharePoint 2010, где среда настраивается с помощью веб-приложения SharePoint с использованием проверки подлинности на основе утверждений.Веб-приложение создается на порту 8081 с использованием проверки подлинности Windows для авторизации и расширяется до порта 80 с использованием проверки подлинности на основе форм.

Поставщик проверки подлинности forms настроен на использование того же active directory, что и сайт аутентификации на базе 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()));
        }
    }

Переданный параметр имени пользователя, следуя примеру, john.smith@mydomain.com.Однако пользователь, добавляемый на сайт, всегда является пользователем на базе Windows auth, i:0#.w/mydomain\johnsmith.

Как мне указать, какого поставщика аутентификации опрашивать при вызове EnsureUser, чтобы я мог гарантировать, что на сайт добавлен правильный пользователь?

Это было полезно?

Решение

Проблема в том, что оба поставщика членства распознают адрес электронной почты, и используется первый результат (ОБЪЯВЛЕНИЕ).Попробуйте FBA_AD_MP:john.smith@mydomain.com - этот синтаксис работает в стандартных элементах управления именем пользователя (используя check name, а не диалоговое окно поиска), и я полагаю, что EnsureUser работает таким же образом.

Другие советы

Короче говоря, вам нужно преобразовать SPUser в SPClaim с помощью SPClaimProviderManager

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top