Я создал приложение в SharePoint 2013, используя AppRegNew.aspx, откуда я получил секретность приложения и идентификатор. Для этого приложения я устанавливаю разрешения для чтения и записи в список документов, используя AppInv.aspx.
Теперь я хочу использовать приложение secrete и Id из другого проекта для доступа к списку документов. Я использую класс TokenHelper, как показано ниже:
TokenHelper.GetAppOnlyAccessToken(TokenHelper.SharePointPrincipal, siteUri.Authority, realm).AccessToken
Но я получаю исключение:
Удаленный сервер ответил на ошибку: (404) Не найден. - Запрошенное пространство имен не существует.
Я отлаживал код из класса TokeHelper и обнаружил, что исключение происходит из этого веб-вызова:
https://accounts.accesscontrol.windows.net/metadata/json/1?realm=my_realm_value
который находится в методе:
private static JsonMetadataDocument GetMetadataDocument(string realm)
Любая помощь будет оценена, спасибо :-)
В конце концов мне удалось разобраться. Я использовал приложение SharePoint, имеющее следующие разрешения:
<AppPermissionRequests AllowAppOnlyPolicy="true">
<AppPermissionRequest Scope="http://sharepoint/content/sitecollection/web/list" Right="Write">
<Property Name="BaseTemplateId" Value="101"/>
</AppPermissionRequest>
</AppPermissionRequests>
Кроме того, я использовал сертификат, чтобы получить токен доступа. Этот сертификат, который я связал с приложением, и установил его как эмитент-маркер доверия с использованием сценария PowerShell:
$issuerID = [System.Guid]::NewGuid().ToString().ToLower()
$publicCertPath = "your_cer_file.cer"
$certificate = Get-PfxCertificate $publicCertPath
$web = Get-SPWeb "http://your.sharepoint.url/"
$realm = Get-SPAuthenticationRealm -ServiceContext $web.Site
$fullAppIdentifier = $issuerId + '@' + $realm
New-SPTrustedSecurityTokenIssuer -Name "High Trust App" -Certificate $certificate - RegisteredIssuerName $fullAppIdentifier -IsTrustBroker
$issuerID
iisreset
Затем я использовал класс TokenHelper следующим образом:
var siteUri = new Uri("my_site_url");
TokenHelper.GetS2SAccessTokenWithWindowsIdentity(siteUri, null);