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

Симптомы

Рассмотрим следующий сценарий. У вас есть существующие развернутые размещенные у поставщика надстройки (PHA), зарегистрированные как RegisteredIssuerName и содержащие исходное значение фермы RealmID SharePoint 2013 или SharePoint 2016, и (или) вы создали связь Workflow Manager в ферме.

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

Примечание.

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

Причина

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

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

Следующее сообщение об ошибке регистрируется в журналах ULS и четко указывает на то, что издатель маркера больше не является доверенным, так как его RealmID значение больше не соответствует ферме:

SPApplicationAuthenticationModule: не удалось проверить запрос, неизвестная ошибка. Сведения об исключении: System.IdenitytModel.Token.SecurityTokenException: проблемы маркера не являются доверенным издателем.

Разрешение

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

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

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

    В следующем сценарии замените {0} веб-приложением. Выходными данными скрипта являются название приложения, идентификатор клиента приложения и целевой веб-сайт всех надстроек, размещенных у поставщика. Эти значения будут использоваться в качестве входных данных на шаге 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 = 'Site'
     $Right = 'Full Control'
     $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, выполните следующий командлет:

     $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, прежде чем реализовывать надстройки, размещенные у поставщика или Workflow Manager, надстройки будут зарегистрированы после SPAuthenticationRealm обновления командлета в соответствии с идентификатором контекста клиента Microsoft 365. Они всегда будут работать, так как значение RealmID больше не изменится. Если гибридные рабочие нагрузки добавляются или перенастраиваются, идентификатор области остается таким же, как идентификатор контекста клиента Microsoft 365.

Чтобы создать отношения доверия между сервером и локальной средой SharePoint и Microsoft 365, запустите Set-SPAuthenticationRealm.

Важно!

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

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

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