Автоматизация сценариев/кода SharePoint с параметром LegacyAuthProtocolsEnabled, для которого задано значение false

Мы используем библиотеку Microsoft.SharePoint.Client для автоматизации работы SharePoint с помощью нашего механизма рабочего процесса, но вчера один из наших клиентов сообщил нам, что хочет отключить устаревшую аутентификацию (для LegacyAuthProtocolsEnabled значение false).

Как только я попробовал это с нашей стороны, я получил исключение Unauthorised.

Все в порядке с желанием отключить Legacy Authentication по очевидным причинам безопасности, но проблема с Modern Authentication заключается в том, что он требует взаимодействия с пользователем, что явно не является решением, поскольку мы выполняем задачи в фоновом режиме.

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

Есть ли способ «аутентифицироваться» в SharePoint без какого-либо взаимодействия с пользователем, когда для LegacyAuthProtocolsEnabled установлено значение false?

Я нашел статью, в которой предлагалось использовать App Authentication, но, прочитав об этом больше, я считаю, что это считается старым методом аутентификации и, вероятно, со временем устареет, но я подумал, что все же попробую случае, но это не сработало. Когда я добрался до

https://tenant.sharepoint.com/_layouts/15/appregnew.aspx

Где tenant — это доменное имя нашей компании, и я нажимаю кнопку «Создать» после заполнения всех соответствующих полей, я получаю следующую ошибку, которая совершенно бесполезна:

Извините, что-то пошло не так Произошла непредвиденная ошибка. ТЕХНИЧЕСКИЕ ПОДРОБНОСТИ

Согласно этой статье КАК ЗАЩИТИТЬ СВОЮ ОНЛАЙН-СРЕДУ SHAREPOINT, ОТКЛЮЧИВ УСТАРЕВШУЮ АУТЕНТИФИКАЦИЮ, устаревшая проверка подлинности больше не была доступна с 13.10.2020, но мы здесь, и эта опция все еще доступна в SharePoint 365. и хотя статья интересна, объясняет, почему Legacy Authentication следует отключать и т. д., в ней не содержится никаких подробностей о том, как следует обрабатывать автоматизированные решения.

Также нашли старую тему «LegacyAuthProtocolsEnabled» и вход в SharePoint Online по сценарию? где @DeanWang предлагает оставить его включенным как:

Весь пользовательский код CSOM, PowerShell перестанет работать

Это также может помешать сторонним приложениям получить доступ к SharePoint. Интернет-ресурсы.

Я собираюсь остановиться здесь, поскольку я мог бы продолжать, и вопрос уже слишком длинный, на мой вкус, и суть в том, знает ли кто-нибудь, есть ли способ и как лучше всего пройти аутентификацию в SharePoint при работе в автоматическом режиме. «скрипты/код» из фоновой задачи, не требующие взаимодействия с пользователем, когда Legacy Authentication выключен?

Спасибо

Обновление-1

Прочитав статьи за статьями, я еще не подключился к SharePoint 365.

Я также трачу больше времени на PnP Framework, как это рекомендуется в многочисленных статьях. Я создал фиктивное приложение со следующим примером кода, который снова используется в различных статьях, включая эту:

Безопасная аутентификация SharePoint с помощью PnP Framework с C# (код)

Мой код идентичен, как вы можете видеть:

var clientContext = new AuthenticationManager().GetACSAppOnlyContext(
    "https://mycompany.sharepoint.com/sites",
    "MyClientid",
    "MySecretId");

using (clientContext)
{
    //Get Lists
    var web = clientContext.Web;
    var lists = web.Lists;

    clientContext.Load(lists);
    clientContext.ExecuteQuery();

    foreach (var list in lists)
    { 
    }
}

И хотя я предоставил полный контроль в Azure для конкретного тестового приложения, которое использует определенные ClientId и SecretId

Я все еще получаю следующую ошибку (401 - unauthorized):

System.Exception
  HResult=0x80131500
  Message=Token request failed.
  Source=PnP.Framework
  StackTrace:
   at SharePointPnP.IdentityModel.Extensions.S2S.Protocols.OAuth2.OAuth2S2SClient.Issue(String securityTokenServiceUrl, OAuth2AccessTokenRequest oauth2Request) in /_/src/lib/PnP.Framework/Utilities/OAuth/OAuth2S2SClient.cs:line 18
   at PnP.Framework.Utilities.TokenHelper.GetAppOnlyAccessToken(String targetPrincipalName, String targetHost, String targetRealm) in /_/src/lib/PnP.Framework/Utilities/TokenHelper.cs:line 116
   at PnP.Framework.Utilities.ACSTokenGenerator.GetToken(Uri siteUrl) in /_/src/lib/PnP.Framework/Utilities/ACSTokenGenerator.cs:line 37
   at PnP.Framework.AuthenticationManager.<GetContextAsync>b__59_0(String site) in /_/src/lib/PnP.Framework/AuthenticationManager.cs:line 971
   at PnP.Framework.AuthenticationManager.<>c__DisplayClass75_0.<GetAccessTokenContext>b__0(Object sender, WebRequestEventArgs args) in /_/src/lib/PnP.Framework/AuthenticationManager.cs:line 1336
   at Microsoft.SharePoint.Client.ClientRuntimeContext.OnExecutingWebRequest(WebRequestEventArgs args)
   at Microsoft.SharePoint.Client.ClientContext.FireExecutingWebRequestEventInternal(WebRequestEventArgs args)
   at Microsoft.SharePoint.Client.ClientContext.GetWebRequestExecutor()
   at Microsoft.SharePoint.Client.ClientContext.GetFormDigestInfoPrivate()
   at Microsoft.SharePoint.Client.ClientContext.EnsureFormDigest()
   at Microsoft.SharePoint.Client.ClientContext.ExecuteQuery()
   at ConsoleApp5.Program.Main(String[] args) in C:\Users\myuser\source\repos\ConsoleApp5\ConsoleApp5\Program.cs:line 23

  This exception was originally thrown at this call stack:
    [External Code]
    SharePointPnP.IdentityModel.Extensions.S2S.Protocols.OAuth2.OAuth2WebRequest.GetResponse() in OAuth2WebRequest.cs
    SharePointPnP.IdentityModel.Extensions.S2S.Protocols.OAuth2.OAuth2S2SClient.Issue(string, SharePointPnP.IdentityModel.Extensions.S2S.Protocols.OAuth2.OAuth2AccessTokenRequest) in OAuth2S2SClient.cs

Inner Exception 1:
WebException: The remote server returned an error: (401) Unauthorized.

Есть ли другой раздел, который я должен посмотреть (и изменить) в App Registration в Azure

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
103
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поскольку мы говорим о SharePoint Online, одним из простых способов подключения к различным сайтам SharePoint является использование подхода Azure AD только для приложений, а поскольку вы говорите о службе Deamon, вы можете легко использовать разрешения приложения при регистрации. Регистрация приложения.

Вы можете и должны узнать больше об этом из связанной статьи Microsoft Docs.

Вы также можете войти в систему с помощью сертификата или секрета регистрации приложения, как это описано в Войдите в Microsoft 365, например, для создания автоматизированных конвейеров CI CD SPFx.

Надеюсь, что вышеизложенное поможет, если не стесняйтесь спрашивать :)

Обновление: пожалуйста, прочитайте ниже, чтобы лучше понять.

Во-первых, в своем сегменте кода вы используете неправильный метод из пакета PnP.Framework.

AuthenticationManager().GetACSAppOnlyContext()

Вышеупомянутый метод относится к совершенно другому методу получения токена аутентификации, а точнее к Sharepoint App-Only model, который... ну.... в настоящее время более или менее используется не так часто. Кажется, я где-то читал, что MS думает об отказе от этого типа аутентификации и переходе на путь аутентификации Azure Active Directory, но, к сожалению, я не могу найти ссылку.

Кроме того, я собрал три проекта и загрузил их на github, чтобы вы могли их увидеть. Вы можете просто клонировать репозиторий и запускать проекты как есть ЗДЕСЬ.

Как вы сами можете убедиться, в решении есть три проекта, каждый из которых вы можете запускать отдельно из VSCode или Vs.

Подробнее:

Консольное приложение1

(извините за название, но забыл переключить :) )

Это проект консоли Deamon, который ссылается на пространство имен PnP.Framework и пытается использовать все преимущества, которые внесли хорошие люди из сообщества PnP. Процедура проста и одинакова для всех трех проектов ->

  1. Прочтите конфигурацию приложения
  2. Запросите токен доступа с соответствующими областями (в зависимости от службы, на которую я ссылаюсь)
  3. Объявите токен, который будет использоваться нашим клиентским контекстом.

В проекте, связанном с PnP.Framework, описанный выше цикл можно увидеть следующим образом:

  1. AuthenticationConfiguration config = AuthenticationConfiguration.ReadFromJsonFile("appsettings.json");
  2. var authManager = new PnP.Framework.AuthenticationManager(config.ClientId, config.Certificate.CertificateDiskPath, config.Certificate.CertificatePassword, config.Tenant);
  3. using (var cc = authManager.GetAccessTokenContext("https://<REPLACE:name of tenant>.sharepoint.com/sites/testsite2", (string siteURL) => authManager.GetAccessToken(siteURL)))

ConsoleAppMSGraph

Как следует из названия, это консольное приложение Deamon использует GraphServiceClient graphClient для получения всей информации, которую вы запрашиваете, через конечную точку графа. Впоследствии вы заметите, что для этого проекта имя области изменяется на

string[] scopes = new string[] { "https://graph.microsoft.com/.default" };

Кроме того, мы запрашиваем коллекцию всех списков, которые в настоящее время находятся на нашем корневом сайте SharePoint, со следующим сегментом:

var lists = await graphClient.Sites["root"].Lists
                            .Request()
                            .GetAsync();

ConsoleAppSPClient

Это приложение является самым простым способом доступа к данным в Sharepoint по умолчанию.

В проектах используются пространства имен MSAL.Net и Microsoft.Sharepoint.Client для получения маркера доступа и последующего внедрения этого маркера во все наши следующие запросы.

Чтобы ответ был немного кратким, обратитесь к здесь, чтобы увидеть, как мы запускаем клиент конфиденциального приложения, запрашиваем токен и позже встраиваем его в наш ClientContext object.

Ноты

  1. Я перечислил в Readme.md репозитория, какие разрешения вы должны предоставить для регистрации вашего приложения. Посмотреть их можно Здесь.
  2. Я использую Sites.FullControl.All, но вы можете сузить список сайтов, к которым будет иметь доступ регистрация приложения, используя Sites.Selected.
  3. Все вышеперечисленные проекты ссылаются на общую библиотеку классов, которая служит строго типизированным объектом конфигурации.
  4. ВАЖНО, вы всегда должны использовать сертификат для аутентификации клиентского приложения, как указано здесь. В предыдущей ссылке также описано, как можно создать сертификат и загрузить его в магазин регистрации приложения.

Я прочитал ссылки, которые вы предоставили, и многие другие статьи, но безрезультатно. Я обновил свой ответ. Может быть, у вас будут дополнительные предложения? Спасибо.

Thierry 24.10.2022 16:57

привет @Thierry, я обновил свой ответ. Решения, которые я предоставил вам для ознакомления, используют разрешения приложения. Я думаю, что вам следует больше узнать о том, какой тип разрешения вы ищете -> делегированное или прикладное. Если это приложение, приложение Deamon Console, которое вы ищете, репозиторий поможет вам понять некоторые основные части системы аутентификации/авторизации.

jimas13 01.11.2022 14:31

Спасибо, Джимас. Очень ценю усилия, приложенные к ответу. В итоге я заставил его работать с самозаверяющим сертификатом (без пароля), но я обязательно рассмотрю ваши различные решения, так как полезно узнать больше о платформе PnP и различных способах аутентификации. MS рекомендует использовать сертификат, поскольку он более безопасен, но это означает необходимость обновлять его каждые x месяцев/лет, что, если честно, неприятно, но я также понимаю последствия этого. Сказав это, clientId просто более удобен. Обратите внимание, что мы используем SDK, а не прямой REST.

Thierry 02.11.2022 10:46

@Thierry Приятно слышать, что тебе удалось это понять. Если вы используете SDK, вы можете проверить третий вариант, где я импортировал пространство имен Microsoft.SharePoint.Client, но имейте в виду, что все это просто классы-оболочки, которые абстрагируют REST API. Чтобы немного упростить задачу с сертификатом, вы можете использовать Azure Key Vault для получения сертификата, и в качестве административной работы вам нужно будет просто заменить его новым!

jimas13 02.11.2022 12:30

Удивительно! Большое спасибо @Jimas13. В течение последних 2 недель я изо всех сил пытался найти решение своей проблемы! Ты спас меня!! Если вы когда-нибудь были в Греции, позвольте мне угостить вас выпивкой!

это не ответ, вы можете прокомментировать ответ и проголосовать за него :) Спасибо

Abdelrahman Gobarah 09.11.2022 07:06

не ответ, это комментарий

Abdelrahman Gobarah 09.11.2022 07:07

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