Не удается программно пройти проверку подлинности в SharePoint Online с помощью федеративных служб.

Я не могу пройти аутентификацию в SharePoint Online с помощью SharePointOnlineCredentials, получая сообщение об ошибке:

Identity Client Runtime Library (IDCRL) обнаружила ошибку при обращении к партнерской STS.

Этот же код работал до тех пор, пока мы не внедрили AD FS для федерации аутентификации в нашей Active Directory. И действительно, код по-прежнему работает, когда я обращаюсь к своему личному сайту SharePoint Online, который не использует федеративные службы. Это заставляет меня подозревать, что существует проблема с использованием SharePointOnlineCredential с федеративными службами.

Кто-нибудь может подтвердить, что это так? И если да, то каков обходной путь?

Я создал простую программу для проверки этой проблемы, которая выглядит следующим образом:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.SharePoint.Client;
using Microsoft.Online.SharePoint.Client;
using System.Security;

namespace SPOConsole
{
    class Program
    {
        static void Main(string[] args)
        {

            var targetSite = new Uri("<https://<mydomain>.sharepoint.com>");
            var login = "<myuserid>@<mydomain>.com";
            var password = "<mypassword>";
            var securePassword = new SecureString();
            foreach (char c in password)
            {
                securePassword.AppendChar(c);
            }

            var onlineCredentials = new SharePointOnlineCredentials(login, securePassword);

            using (ClientContext clientContext = new ClientContext(targetSite))
            {
                clientContext.Credentials = onlineCredentials;
                Web web = clientContext.Web;
                clientContext.Load(web,
                webSite => webSite.Title);

                clientContext.ExecuteQuery();
                Console.WriteLine(web.Title);

                Console.Read();

            }

        }
    }
}

Код не работает в строке:

        var onlineCredentials = new SharePointOnlineCredentials(login, securePassword);

Ниже приведена трассировка стека:

Microsoft.SharePoint.Client.IdcrlException was unhandled
  HResult=-2147186451
  Message=Identity Client Runtime Library (IDCRL) encountered an error while talking to the partner STS.
  Source=Microsoft.SharePoint.Client.Runtime
  ErrorCode=-2147186451
  StackTrace:
       at Microsoft.SharePoint.Client.Idcrl.ManagedIdcrl.CheckHResult(Int32 hr)
       at Microsoft.SharePoint.Client.Idcrl.ManagedIdcrl.LogonIdentity(String username, SecureString password)
       at Microsoft.SharePoint.Client.Idcrl.SharePointOnlineAuthenticationProvider.Logon(String username, SecureString password)
       at Microsoft.SharePoint.Client.SharePointOnlineCredentials..ctor(String username, SecureString password)
       at SPOConsole.Program.Main(String[] args) in c:\Users\michael.norton\Documents\Visual Studio 2012\Projects\SimpleSPOConnection\SPOConsole\Program.cs:line 26
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

person Brite Shiny    schedule 05.05.2014    source источник


Ответы (3)


Я решил проблему, убедившись, что использую клиентские компоненты SharePoint Online в своем коде. Вот шаги, которые я предпринял:

  1. Удалена командная консоль SharePoint Online (http://www.microsoft.com/en-us/download/details.aspx?id=35588). Исходная программа, которая была написана прошлой осенью и начиналась как расширение программы PowerShell, использовала Microsoft.Online.SharePoint.Client.Tenant.dll, поставляемую с командной консолью SharePoint Online. Программа должна ссылаться на C:\Program Files\SharePoint Client Components\16.0\Assemblies\Microsoft.Online.SharePoint.Client.Tenant.dll.

  2. Установлен последний пакет SDK клиентских компонентов SharePoint Online (http://www.microsoft.com/en-us/download/details.aspx?id=42038). Важно отметить, что этот SDK отличается от SDK клиентских компонентов SharePoint 2013. Пакет SDK для клиентских компонентов SharePoint Online — это версия 16; SDK клиентских компонентов SharePoint 2013 — это версия 15.

  3. Убедитесь, что библиотеки DLL Microsoft.SharePoint.Client и Microsoft.SharePoint.Client.Runtime в программе, загруженной из версии 16, находятся в папке расширений веб-сервера, например. C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll.

Теперь я могу пройти аутентификацию, используя как федеративные, так и нефедеративные учетные записи.

person Brite Shiny    schedule 22.05.2014
comment
версия 16 обратно совместима с версией 15? Если нет, как мне развернуть обе версии и использовать их из кода? Нужно ли мне динамически загружать сборку в зависимости от того, на какой экземпляр sharepoint пользователь ориентируется из моего клиентского приложения? - person monkeyjumps; 26.01.2016
comment
Кажется, это больше не работает. У меня есть следующие ссылки: Microsoft.SharePoint.Client — версия: 16.1.0.0 версия файла: 16.1.4727.1200 Microsoft.SharePoint.Client.Runtime — версия: 16.1.0.0 версия файла: 16.1.4727.1200 При входе в систему по-прежнему возникает следующая ошибка в федеративном экземпляре SharePoint Online, но работает в обычном веб-сайте SharePoint. Библиотека времени выполнения (IDCRL) обнаружила ошибку при обращении к партнерской службе STS. - person Shailen Sukul; 29.01.2016

Максимилиан, вы можете использовать что-то вроде следующего, чтобы добавить их:

$spoClientAssemblies = 
'C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll',
'C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll'

foreach($reqAssembly in $spoClientAssemblies)
{
    Add-Type -LiteralPath $reqAssembly -ErrorAction:Continue
}

Вы также можете проверить сборки текущего домена на наличие dll.

[AppDomain]::CurrentDomain.GetAssemblies()
person Michael Veazie    schedule 14.01.2016

Вам необходимо убедиться, что вы загружаете необходимые сборки SharePoint Online в начале своего скрипта.

Add-Type -Path "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.dll" 

Add-Type -Path "C:\Program Files\SharePoint Online Management Shell\Microsoft.Online.SharePoint.PowerShell\Microsoft.SharePoint.Client.Runtime.dll"
person Ahmed Salem    schedule 03.05.2019