Невозможно проверить подлинность вызовов SharePoint REST или CSOM из .NET Core - PullRequest
0 голосов
/ 17 октября 2018

У меня проблемы с доступом к SharePoint с использованием как CSOM, так и службы REST из консольного приложения .NET Core.

Сначала я создал консольное приложение для .NET Framework 4.6.1, установил Microsoft.SharePointOnlineПакет .CSOM nuget и добавлены два примера методов для подключения к SharePoint с использованием жестко закодированных учетных данных пользователя.Это работает.

public static void CsomCall()
{
    var password = "password";
    var securePassword = new SecureString();
    foreach (var c in password.ToCharArray()) securePassword.AppendChar(c);

    using (ClientContext context = new ClientContext("https://siteurl"))
    {
        context.Credentials = new SharePointOnlineCredentials("user@domain", securePassword);
        Web web = context.Web;
        context.Load(web);
        context.ExecuteQuery();
        Console.WriteLine(web.Title);
    }
}
private static void RestCall()
{
    var password = "password";
    var securePassword = new SecureString();
    foreach (var c in password.ToCharArray()) securePassword.AppendChar(c);

    var credentials = new SharePointOnlineCredentials("user@domain", securePassword);

    using (WebClient client = new WebClient())
    {
        client.Headers.Add("X-FORMS_BASED_AUTH_ACCEPTED", "f");
        client.Credentials = credentials;
        client.Headers.Add(HttpRequestHeader.ContentType, "application/json;odata=verbose");
        client.Headers.Add(HttpRequestHeader.Accept, "application/json;odata=verbose");
        var content = client.DownloadString("https://siteurl/_api/web/lists");
        Console.WriteLine(content);
    }
}

Затем я создал консольное приложение .NET Core и скопировал методы, описанные выше.Я понимаю, что SharePoint CSOM еще не поддерживается в .NET Core, поэтому я использовал обходной путь, предложенный здесь , и вручную ссылался на Microsoft.SharePoint.Client.Portable.dll, Microsoft.SharePoint.Client.Runtime.Portable.dll и Microsoft.SharePoint.Client.Runtime.Windows.dll.

Мне пришлось внести несколько изменений для компиляции кода:

  • .ExecuteQueryAsync() вместо.ExecuteQuery()

  • var credentials = new SharePointOnlineCredentials("user@domain", password); Обратите внимание, что пароль - это простая строка в Microsoft.SharePoint.Client.Runtime.Portable.

При запускеCsomCall происходит сбой при доступе к web.Title:

Microsoft.SharePoint.Client.PropertyOrFieldNotInitializedException: 'Свойство или поле' Title 'не было инициализировано.Он не был запрошен или запрос не был выполнен.Может потребоваться явный запрос. '

При запуске RestCall происходит сбой с ошибкой на client.DownloadString:

System.Net.WebException:' Удаленный сервервозвратил ошибку: (401) Unauthorized. '

Возможно ли настроить SharePointOnlineCredentials для работы с .NET Core?Поиски переполнения стека показывают, что это должно быть возможно, но я просто не могу заставить его работать.

В конечном итоге мы хотели бы создать службу Web API с использованием ASP.NET Core для генерации документов для внутренних пользователей (чтение шаблонов документов из SharePoint, создание нового документа и сохранение обратно в SharePoint).Используя CSOM или REST, и пока работаем в ОС Windows.

1 Ответ

0 голосов
/ 17 октября 2018

REST-вызов неверен.Вы должны получить токен, используя учетные данные.Кроме того, WebClient в основном устарел, вместо этого используйте класс HttpClient.

Посмотрите на этот пример:

public const string BaseUri = "https://example.sharepoint.com";
private static HttpClient _client;

public static void Initialize()
{
    SharePointOnlineCredentials currentCredentials = GetCredentialsHere();

    var handler = new HttpClientHandler
    {
        Credentials = currentCredentials
    };

    _client = new HttpClient(handler);

    // you are missing this line
    handler.CookieContainer.SetCookies(BaseUri, currentCredentials.GetAuthenticationCookie(BaseUri));
    _client.BaseAddress = BaseUri;
    _client.DefaultRequestHeaders.Clear();
    _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    _client.MaxResponseContentBufferSize = 2147483647;
}
...