Токен MSAL AD недопустим с SharePoint Online CSOM - PullRequest
0 голосов
/ 19 февраля 2019

Я могу получить и использовать токен доступа через MSAL в настольном .Net проекте.Я могу успешно получить токены, и они действительны в моих вызовах Graph.

Однако попытка использовать токен доступа с CSOM SharePoint Online приводит к 401: Несанкционированный.Это похоже на доступ к API REST sharepoint с использованием бросков msal 401 (за исключением того, что я использую C # и последний CSOM).

Насколько я понимаю, MSFT пытается отодвинуть разработчиков от ADALи в сторону MSAL, но, похоже, существует некоторая проблема совместимости с токенами.

Кто-нибудь смог указать необходимые области и использовать токен OAuth с авторизацией на предъявителя из MSAL для доступа к SharePoint Online?

1 Ответ

0 голосов
/ 28 июня 2019

Не уверен, почему вы используете MSAL напрямую для доступа к SharePoint Online API.Самый простой способ - использовать Microsoft.SharePointOnline.CSOM

var clientContext = new ClientContext(siteUrl);
clientContext.Credentials = new SharePointOnlineCredentials(userName, securedPassword);

, и вы закончили работу с CSOM API.

Но я думаю, что это должно быть возможно с MSALтакже.Имейте в виду, что полученный вами токен предоставляется для какого-либо ресурса.Скопируйте синтаксический анализ вашего токена в http://jwt.ms/ и посмотрите на aud значение

enter image description here

, если это поле содержит https://graph.microsoft.com, оно простоне может быть действительным для вас https://yourtenant.sharepoint.com, а вам нужен другой!

Вы должны быть в состоянии запросить правильный токен, используя Microsoft.Identity.Client

var authority = $"https://login.microsoftonline.com/{tenantId}";
var app = ConfidentialClientApplicationBuilder.Create(clientId)
    .WithClientSecret(clientSecret)
    .WithAuthority(new Uri(authority))
    .Build();

var scopes = new[] { "https://yourtenant.sharepoint.com/.default" };
var authenticationResult = await app.AcquireTokenForClient(scopes)
    .ExecuteAsync();

Какрезультат authenticationResult.AccessToken должен содержать токен доступа, действительный для SharePoint Online REST API.(https://yourtenant.sharepoint.com/.default означает, что вы запрашиваете все области, настроенные для приложения Azure AD) *

Когда вы декодируете новый струйный токен, он должен выглядеть следующим образом

enter image description here

...