Не удалось войти в систему для пользователя «<участник, идентифицированный токеном>» при авторизации на SQL Server через субъект-службу из назначенной группы AAD

Я посетил и попробовал несколько примеров, но ошибка все та же. У меня есть группа AAD с именем Azure_SqlServer_Admins, назначенная SQL Server в разделе Entra в качестве администратора Microsoft Entra. У меня есть имя участника-службы DevEnvSP, привязанное к этой группе (внутри). DevEnvSP также используется в моих конвейерах Azure DevOps, а также для развертывания sql-сервера, сборки и т. д. Этот субъект службы имеет роль участника и может читать пользователей (чтение каталога). я сделал по инструкции

Цель: из конвейера в качестве субъекта-службы выполнить SQL-скрипт для базы данных. Я попробовал несколько разных кодов, например:

- task: SqlAzureDacpacDeployment@1
  displayName: 'name'
  inputs:
    azureSubscription: ${{ variables.subscriptionName }}
    AuthenticationType: 'servicePrincipal'
    ServerName: ${{ variables.sqlServerName }}.database.windows.net
    DatabaseName: ${{ parameters.sqlDbName }}
    IpDetectionMethod: 'AutoDetect'
    deployType: 'InlineSqlTask'
    SqlInline: my sql code

Я получаю сообщение об ошибке «Не удалось войти в систему для пользователя» на этапе конвейера. Хорошо, я также попробовал другой случай из Microsoft Docs, я получил секрет, получил идентификатор клиента и прошел через accessToken:

- task: AzurePowerShell@5
  displayName: Creating user for ${{ parameters.sqlDbName }}
  inputs:
    azureSubscription: ${{ variables.subscriptionName }}
    azurePowerShellVersion: 'LatestVersion'
    ScriptType: 'InlineScript'
    FailOnStandardError: true
    Inline: |
        $token = (Get-AzAccessToken -ResourceUrl https://database.windows.net).Token

        $CmdText = @"
            My SQL query
        "@
        
        Invoke-SqlCmd -ServerInstance "${{ variables.sqlServerName }}.database.windows.net" `
                      -Database "DbTest" `
                      -AccessToken $token `
                      -Query $CmdText
                      -Verbose
                      -OutputSqlErrors $true

К сожалению, та же ошибка.

Я прочитал соответствующий и похожий ответ StackOverflow: https://stackoverflow.com/a/71510259/17239546 . Похоже, существуют некоторые ограничения, связанные с администратором, если он назначен группой AAD. Откуда: https://learn.microsoft.com/en-us/sql/t-sql/statements/create-database-scoped-credential-transact-sql?view=sql-server-ver16#remarks

Учетные данные в области базы данных — это запись, содержащая данные аутентификации, необходимые для подключения к ресурсу за пределами SQL Server. Большинство учетных данных включают пользователя и пароль Windows.

Но я не нашел решения для этой проблемы или что-то упустил во всех примерах, все используют в качестве администратора одного пользователя/sp, а не группу, и это работает.

ПРИМЕЧАНИЕ:

  • Я даже попробовал вручную создать пользователей для конкретной базы данных и войти в систему, ничего не изменилось:
DECLARE @UMIUser NVARCHAR(100) = 'SP name';
IF DATABASE_PRINCIPAL_ID(@UMIUser) IS NULL
BEGIN
  CREATE USER [@UMIUser] FROM EXTERNAL PROVIDER;
  ALTER ROLE db_datareader ADD MEMBER [@UMIUser];
  ALTER ROLE db_datawriter ADD MEMBER [@UMIUser];
  ALTER ROLE db_ddladmin ADD MEMBER [@UMIUser];
END
  • С сетью SQL Server все в порядке, никаких ограничений
  • Разрешить службам и ресурсам Azure доступ к этому серверу, установленному как true.
  • Имя SQL Server, полное имя и база данных верны, потому что я могу авторизоваться с помощью типа аутентификации sql.

Буду признателен, если кто-нибудь поможет мне в этом...

Чтобы определить причину проблемы, пытались ли вы пройти аутентификацию по принципу службы локально, а затем получить доступ $token для запуска Invoke-SqlCmd? Вот сценарий, который вы можете протестировать для аутентификации доступа к Azure в самом начале.

Alvin Zhao - MSFT 26.06.2024 11:34
$TenantId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"$ApplicationId = "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"$ClientSecret = "zzzzzz"$azurePassword = ConvertTo-SecureString "$ClientSecret" -AsPlainText -Force$pscredential = New-Object System.Management.Automation.PSCredential($ApplicationId , $azurePassword)Connect-AzAccount -Credential $pscredential -TenantId $TenantId -ServicePrincipal
Alvin Zhao - MSFT 26.06.2024 11:34

Вы также можете установить $DebugPreference = 'Continue', чтобы получать более подробные журналы в сеансе PowerShell при запуске команд AzurePowerShell.

Alvin Zhao - MSFT 26.06.2024 11:38

Кроме того, по принципу субъекта-службы в группе AAD, это регистрация приложения или управляемое удостоверение?

Alvin Zhao - MSFT 26.06.2024 11:58

Регистрация приложения @AlvinZhao-MSFT

Mykyta Halchenko 26.06.2024 11:59

Если приложение недавно добавлено в группу AAD, вступление в силу права на членство в группе может занять некоторое время.

Alvin Zhao - MSFT 26.06.2024 12:14

@AlvinZhao-MSFT большое спасибо за ваши ответы, я успешно получил токен доступа, но не могу войти с ним в систему. Что касается второго вопроса, приложение не добавлено недавно, оно устарело :(

Mykyta Halchenko 26.06.2024 12:50

Привет! Последние результаты: поскольку команда AzurePowerShell также не удалась в локальном сценарии, я думаю, мы могли бы исключить причину в среде агента Azure Pipelines; и я подозреваю, что приложение, на которое ссылается ваш сценарий или задача конвейера, было добавлено в группу AAD в качестве администратора SQL-сервера. Существует вероятность того, что несколько регистраций приложений имели одно и то же имя. Не могли бы вы еще раз проверить, совпадает ли идентификатор приложения корпоративного приложения в группе AAD администратора SQL с идентификатором регистрации приложения, на которое ссылается соединение службы ARM в вашей задаче конвейера?

Alvin Zhao - MSFT 26.06.2024 13:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Основываясь на вашем описании, я создал базу данных SQL Azure с администратором, установленным в качестве группы AAD, и мне удалось получить доступ к базе данных через конвейер YAML ниже, чтобы выполнить простой запрос.

variables:
  ARMSvcCnnName: ARMSvcCnnSubX
  AzureSQLServerName: xxxazsqlserverxxx
  AzureSQLDBName: xxxazsqldbxxx
  system.debug: true

pool:
  vmImage: 'windows-latest'

steps:
- task: SqlAzureDacpacDeployment@1
  displayName: 'Run SQL query'
  inputs:
    azureSubscription: '$(ARMSvcCnnName)'
    AuthenticationType: 'servicePrincipal'
    ServerName: '$(AzureSQLServerName).database.windows.net'
    DatabaseName: '$(AzureSQLDBName)'
    deployType: 'InlineSqlTask'
    SqlInline: 'SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES;'
    IpDetectionMethod: 'AutoDetect'
    DeleteFirewallRule: false

Поскольку задача SqlAzureDacpacDeployment@1 ссылалась на подключение службы Azure Resource Manager для аутентификации доступа к базе данных SQL Azure на основе ее базового субъекта-службы (регистрации приложения), который должен быть членом группы администраторов SQL-сервера, я бы также предложил установить переменную конвейера system.debug как true, чтобы информация об субъекте-службе была видна в журналах отладки, чтобы мы могли дважды проверить правильность выбранного нами подключения к службе ARM.

Кроме того, проверьте журналы входа в AAD, чтобы узнать, есть ли дополнительная информация о том, почему не удалось выполнить вход субъекта-службы.

Спасибо. Идентификатор субъекта-службы подключения Azure DevOps действительно отличался.

Mykyta Halchenko 26.06.2024 16:12

Рад узнать, что эта информация помогает проверить базовый субъект-службу. Ваше здоровье.

Alvin Zhao - MSFT 26.06.2024 16:15

Другие вопросы по теме