Надстройки с хостингом поставщика перестают работать и ошибка HTTP 401 после настройки гибридных функций фермы SharePoint

Симптомы

Изучите нижеприведенный сценарий. У вас есть существующие развернутые надстройки с размещением поставщика (PHA), зарегистрированные как и содержащие исходное значение realmID фермы для <RegisteredIssuerName> фермы SharePoint 2013 или SharePoint 2016, и/или вы создали ассоциацию Диспетчер рабочего процесса в ферме.

В этом сценарии при доступе к этим phAs после настройки гибридных функций SharePoint в ферме, phAs перестают функционировать. Кроме того, вы получаете сообщение об ошибке HTTP 401 при направе на надстройки.

Примечание

PhAs может включать внешнее веб-приложение, службу, базу данных или компонент SharePoint.
Эта проблема не существует, если сначала настроить гибридные функции, а затем развернуть надстройки и/или диспетчер рабочего процесса с размещением поставщика в ферме SharePoint 2013 или SharePoint 2016.

Причина

Настройка гибридных функций SharePoint для SharePoint 2013 или SharePoint 2016 нарушает доверие сервера к серверу (S2S), созданные перед настройкой гибридных функций. При попытке установить доверие S2S с помощью скрипта облачной SSA на борту или гибридного выборщика область проверки подлинности локальной фермы обновляется в соответствие с контекстным ИД клиента Office 365. Скрипт задает область проверки подлинности с помощью комлета Set-SPAuthenticationRealm. После изменения области проверки подлинности имеющиеся надстройки SharePoint не могут проходить аутентификацию.

Этот сбой проверки подлинности возникает из-за того, как надстройки, на которые работает поставщик, уполномочены получать доступ к SharePoint. Надстройки SharePoint связаны с spTrustedSecurityTokenIssuers с помощью значения IssuerId. По запросу надстройка пытается получить маркер от эмитента службы безопасных маркеров (STS). Эмитенты маркеров привязаны к области проверки подлинности. После изменения области надстройки SharePoint больше не могут успешно проверить подлинность. Надежный эмитент маркеров с правильным ИД эмитента по-прежнему существует в ферме. Однако он связан с предыдущей областью проверки подлинности. Фактическое <RegisteredIssuerName> значение , в котором значение IssuerId@OldAuthRealmGuid oldAuthRealmGuid больше не соответствует текущему значению AuthRealmGuid. Надстройка не удается проверить подлинность, так как stS не может найти выдающий маркер.

Следующее сообщение об ошибке регистрируется в журналах ULS и ясно указывает, что эмитенту маркера больше не доверяют, так как его значение RealmID больше не соответствует ферме: SPApplicationAuthenticationModule: Не удалось проверить подлинность запроса, неизвестная ошибка. Сведения об исключениях: System.IdenitytModel.Tokens.SecurityTokenException. Проблемы маркера не являются доверенным эмитентом.

Решение

При настройке гибрида realmID меняется в соответствие с ИД клиента подписки Office365. Это приводит к остановке работы надстройки, как поясняется в разделе "Симптомы". Чтобы восстановить функциональные возможности надстройки SharePoint, зарегистрируйте надстройки, размещенные у поставщика, с помощью значения, содержащего <RegisteredIssuerName> новый ID области. Затем повторно привнося разрешения надстройки для каждого экземпляра надстройки.

Чтобы устранить проблемы, связанные с проверкой подлинности, связанные с надстройки и гибридными функциями, которые находятся у поставщика, выполните следующие действия:

  1. Запустите следующий скрипт, чтобы обнаружить все экземпляры приложений, развернутые в веб-приложении:

    В следующем сценарии {0} замените веб-приложение. Выходами сценария являются название приложения, ID клиента приложения и целевая веб-сеть всех надстройок, на которые работает поставщик. Эти значения будут использоваться в качестве входных данных в шаге 3.

     Add-PsSnapin Microsoft.SharePoint.PowerShell
     Add-PsSnapin Microsoft.SharePoint.PowerShell
     $webApp = Get-SPWebApplication "{0}"
     foreach($site in $webApp.Sites){
     foreach($web in $site.AllWebs)
     {
     $appInstance = Get-SPAppInstance -Web $web.Url | ? {$_.LaunchUrl -notlike "~appWebUrl*"} | select Title, AppPrincipalId
     if($appInstance -ne $null)
     {
     foreach ($instance in $appInstance)
     {
     $tmp = $instance.AppPrincipalId.Split('|@',[System.StringSplitOptions]::RemoveEmptyEntries)
     $appInfo = $instance.Title + " - " + $tmp[$tmp.Count - 2] + " - " + $web.Url
     Write-Output $appInfo
     }
     }
     }
     }
    
  2. Обновление spTrustedSecurityTokenIssuers с помощью следующего сценария:

     $NewRealm = Get-SPAuthenticationRealm
     $sts = Get-SPTrustedSecurityTokenIssuer | ? {$_.Name -ne 'EvoSTS-Trust' -and $_.Name -ne 'ACS_STS'} | Select RegisteredIssuerName
     $realm = $sts | ?{$_.RegisteredIssuerName -ne $null} | %{$($($_.RegisteredIssuerName).toString().split('@',2)[1]).toString()} | ?{$_ -ne '*' -and $_ -ne $newRealm}
     if($Realm.count -gt 0) {
     $TempRealm = '*@$($NewRealm)'
     $Issuers = Get-SPTrustedSecurityTokenIssuer | ?{$_.Name -ne 'EvoSTS-Trust' -and $_.Name -ne 'ACS_STS' -and $_.RegisteredIssuerName -ne $null -and $_.RegisteredIssuerName -notlike '*@`*' -and $_.RegisteredIssuerName -notlike $TempRealm}
    
     $Guid = [guid]::NewGuid()
     foreach ($Issuer in $Issuers)
     {
     $NameCopy = $Issuer.Name
     $NewIssuerName = $Guid
     $IssuerCertificate = $Issuer.SigningCertificate
     $OldRegisteredIssuerID = $Issuer.RegisteredIssuerName
     $IssuerID = $OldRegisteredIssuerID.Split('@')[0]
     $NewRegisteredIssuerName = $IssuerID + '@' + $NewRealm
     $NewIssuer = New-SPTrustedSecurityTokenIssuer -Name $NewIssuerName -Certificate $IssuerCertificate -RegisteredIssuerName $NewRegisteredIssuerName -IsTrustBroker
     Remove-SPTrustedSecurityTokenIssuer $Issuer -Confirm:$false
     $NewIssuer.Name = $NameCopy
     $NewIssuer.Update()
     }
     }
    
  3. Исправление каждой надстройки, которая была найдена в шаге 1, при запуске следующего сценария:

    В скрипте замените и значения, полученные {0} {1} на {2} шаге 1.

     $appTitle = '{0}'
     $clientID = '{1}'
     $targetWeb = Get-SPWeb '{2}'
     $Scope = 'Taxonomy'
     $Right = 'FullControl'
     $authRealm = Get-SPAuthenticationRealm -ServiceContext $targetWeb.Site
     $AppIdentifier = $clientID + '@' + $authRealm
     Register-SPAppPrincipal -NameIdentifier $AppIdentifier -Site $targetWeb -DisplayName $appTitle
     $appPrincipal = Get-SPAppPrincipal -Site $targetWeb -NameIdentifier $AppIdentifier
     Set-SPAppPrincipalPermission -Site $targetWeb -AppPrincipal $appPrincipal -Scope $Scope -Right $Right
    

    Чтобы обновить область проверки подлинности для workflow Manager, запустите следующий cmdlet:

     $workflowproxy = Get-SPWorkflowServiceApplicationProxy
     $webapp = get-spwebapplication
     if ($webapp)
     {
     $webappurl = $webapp[0].url
     $Site=get-spsite $webappurl
     if ($site)
     {
     $workflowaddress = $workflowproxy.GetWorkflowServiceAddress($site)
     $workflowscopename = $workflowproxy.GetWorkflowScopeName($site)
     $TrimScope = '/'+$workflowscopename+'/'
     $wfmaddress = $workflowaddress.TrimEnd($Trimscope)
     }
     }
     $workflowproxy.delete()
     Register-SPWorkflowService -SPSite $Site -WorkflowHostUri $wfmaddress -Force
    

    Если вы развернули сценарии доверия между фермами перед настройкой гибридных функций, используйте методы в следующих темах TechNet, чтобы исправить сценарии вручную:

Дополнительная информация

В сценарии настройки гибридных рабочих нагрузок, которые требуют S2S перед реализацией надстройок или диспетчера рабочих процессов, надстройки будут зарегистрированы после обновления командлета SPAuthenticationRealm в соответствие с контекстным ИД клиента Office 365. Они всегда будут работать, так как значение RealmID больше не изменится. Если гибридные рабочие нагрузки добавляются или перенастрояются, то ID области остается таким же, как и контекстный ID контекста Office 365. Чтобы создать доверительные отношения между локальной средой SharePoint и Office 365, запустите командалет Set-SPAuthenticationRealm.

Важно!

В этом разделе содержится раздел "Внимание", который предупреждает, что любые маркеры доступа, созданные для определенной области, не будут работать после изменения значения SPAuthenticationRealm.

Чтобы создать надстройки с хостингом поставщика SharePoint,см. в раздел Начало создания надстройок SharePoint с хостингом поставщика.

Требуется дополнительная помощь? Перейдите в сообщество SharePoint.