Мы используем библиотеку 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
Поскольку мы говорим о 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.
Подробнее:
(извините за название, но забыл переключить :) )
Это проект консоли Deamon, который ссылается на пространство имен PnP.Framework и пытается использовать все преимущества, которые внесли хорошие люди из сообщества PnP. Процедура проста и одинакова для всех трех проектов ->
В проекте, связанном с PnP.Framework, описанный выше цикл можно увидеть следующим образом:
AuthenticationConfiguration config = AuthenticationConfiguration.ReadFromJsonFile("appsettings.json");
var authManager = new PnP.Framework.AuthenticationManager(config.ClientId, config.Certificate.CertificateDiskPath, config.Certificate.CertificatePassword, config.Tenant);
using (var cc = authManager.GetAccessTokenContext("https://<REPLACE:name of tenant>.sharepoint.com/sites/testsite2", (string siteURL) => authManager.GetAccessToken(siteURL)))
Как следует из названия, это консольное приложение Deamon использует GraphServiceClient graphClient
для получения всей информации, которую вы запрашиваете, через конечную точку графа.
Впоследствии вы заметите, что для этого проекта имя области изменяется на
string[] scopes = new string[] { "https://graph.microsoft.com/.default" };
Кроме того, мы запрашиваем коллекцию всех списков, которые в настоящее время находятся на нашем корневом сайте SharePoint, со следующим сегментом:
var lists = await graphClient.Sites["root"].Lists
.Request()
.GetAsync();
Это приложение является самым простым способом доступа к данным в Sharepoint по умолчанию.
В проектах используются пространства имен MSAL.Net и Microsoft.Sharepoint.Client для получения маркера доступа и последующего внедрения этого маркера во все наши следующие запросы.
Чтобы ответ был немного кратким, обратитесь к здесь, чтобы увидеть, как мы запускаем клиент конфиденциального приложения, запрашиваем токен и позже встраиваем его в наш ClientContext object
.
Sites.FullControl.All
, но вы можете сузить список сайтов, к которым будет иметь доступ регистрация приложения, используя Sites.Selected.привет @Thierry, я обновил свой ответ. Решения, которые я предоставил вам для ознакомления, используют разрешения приложения. Я думаю, что вам следует больше узнать о том, какой тип разрешения вы ищете -> делегированное или прикладное. Если это приложение, приложение Deamon Console, которое вы ищете, репозиторий поможет вам понять некоторые основные части системы аутентификации/авторизации.
Спасибо, Джимас. Очень ценю усилия, приложенные к ответу. В итоге я заставил его работать с самозаверяющим сертификатом (без пароля), но я обязательно рассмотрю ваши различные решения, так как полезно узнать больше о платформе PnP и различных способах аутентификации. MS рекомендует использовать сертификат, поскольку он более безопасен, но это означает необходимость обновлять его каждые x месяцев/лет, что, если честно, неприятно, но я также понимаю последствия этого. Сказав это, clientId просто более удобен. Обратите внимание, что мы используем SDK, а не прямой REST.
@Thierry Приятно слышать, что тебе удалось это понять. Если вы используете SDK, вы можете проверить третий вариант, где я импортировал пространство имен Microsoft.SharePoint.Client, но имейте в виду, что все это просто классы-оболочки, которые абстрагируют REST API. Чтобы немного упростить задачу с сертификатом, вы можете использовать Azure Key Vault для получения сертификата, и в качестве административной работы вам нужно будет просто заменить его новым!
Удивительно! Большое спасибо @Jimas13. В течение последних 2 недель я изо всех сил пытался найти решение своей проблемы! Ты спас меня!! Если вы когда-нибудь были в Греции, позвольте мне угостить вас выпивкой!
это не ответ, вы можете прокомментировать ответ и проголосовать за него :) Спасибо
не ответ, это комментарий
Я прочитал ссылки, которые вы предоставили, и многие другие статьи, но безрезультатно. Я обновил свой ответ. Может быть, у вас будут дополнительные предложения? Спасибо.