Подключите регистрацию приложения Azure к базе данных SQL Azure через Powershell - PullRequest
0 голосов
/ 30 октября 2019

Для запуска требуется сценарий Powershell, который будет входить в базу данных SQL Azure в качестве регистрации приложения Azure AD. Мне удалось получить токен доступа для регистрации приложения, но я получаю сообщение об ошибке при попытке войти в базу данных с ним:

Исключение, вызывающее «Open» с аргументом «0» (s)): "Ошибка входа пользователя 'NT AUTHORITY \ ANONYMOUS LOGON'."

Я создал пользователя и применил гранты в целевой базе данных.

CREATE USER [App Reg Dave Test] FROM EXTERNAL PROVIDER;
ALTER ROLE [db_datareader] ADD MEMBER [App Reg Dave Test];
ALTER ROLE [db_datawriter] ADD MEMBER [App Reg Dave Test];  

I'mне уверен, что это необходимо, но я также предоставил разрешения API для регистрации приложения для базы данных SQL User_Impersonation и App_Impersonation. Вот пример моего кода PS. Сбой команды $ connection.open ().

#-- Intall ADAL.ps
# Import-Module ADAL.PS

#-----------------------------------
#--  Get Token for App Registration
#-----------------------------------

$tenantId = "448b9f7b-9e69-xxxx-xxxx-xxxxxxxxxxxx"
$authority = "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/authorize"
$resourceUrl = "api://123a7216-7b20-yyyy-yyyy-yyyyyyyyyyyy"
$clientId = "123a7216-7b20-yyyy-yyyy-yyyyyyyyyyyy"
$secret = ConvertTo-SecureString -String "X87ZK@NPw=zzzzzzzzzzzzzzzzzzzx/-" -AsPlainText -Force
$response = Get-ADALToken -Authority $authority -Resource $resourceUrl -ClientId $clientId -ClientSecret $secret
$token = $response.AccessToken

#-----------------------------------
#--  Connect to DB
#-----------------------------------

$sqlServerUrl = "dave-sqls2.database.windows.net"
$database = "advworks"
$connectionString = "Server=tcp:$sqlServerUrl,1433;Initial Catalog=$database;Persist Security Info=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;"
$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)

# Add AAD generated token to SQL connection token
$connection.AccessToken = $response.AccessToken

$connection  #-- Output connection object for debugging.

$query = "SELECT @@Servername, @@Version"
$command = New-Object -Type System.Data.SqlClient.SqlCommand($query, $connection)
$connection.Open()

$adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command
$dataset = New-Object System.Data.DataSet
$adapter.Fill($dataSet) | Out-Null
$connection.Close()
$dataSet.Tables

1 Ответ

1 голос
/ 31 октября 2019

Согласно предоставленному вами скрипту PowerShell, вы используете неправильный resourceUrl. Пожалуйста, обновите URL ресурса как https://database.windows.net/. Для получения более подробной информации, пожалуйста, обратитесь к блогу .

Подробные шаги приведены ниже. 1. Создайте субъект обслуживания

$SecureStringPassword = ConvertTo-SecureString -String "[Enter SPN Password]" -AsPlainText -Force
New-AzureRmADApplication -DisplayName "[Enter name for Application]" -HomePage "https://www.contoso.com/sqldb-spn" -IdentifierUris "https://www.contoso.com/sqldb-spn" -Password $SecureStringPassword -OutVariable app
New-AzureRmADServicePrincipal -ApplicationId $app.ApplicationId
Используйте администратора Azure AD для входа в Azure SQL через SSMS. Затем выполните следующую команду
CREATE USER [your app name] FROM EXTERNAL PROVIDER;
ALTER ROLE [db_datareader] ADD MEMBER [App Reg Dave Test];
ALTER ROLE [db_datawriter] ADD MEMBER [App Reg Dave Test];
Получить токен доступа
$tenantId = "your tenant id"
$authority = "https://login.microsoftonline.com/$tenantId/oauth2/authorize"
$resourceUrl = "https://database.windows.net/"
$clientId = "your application id"
$secret=ConvertTo-SecureString "" -AsPlainText -Force
$response = Get-ADALToken -Authority $authority -Resource $resourceUrl -ClientId $clientId -ClientSecret $secret
$token = $response.AccessToken

4 Connect SQL


$sqlServerUrl = "<your server name>.database.windows.net"
$database = "master"
$connectionString = "Server=tcp:$sqlServerUrl,1433;Initial Catalog=$database;Connect Timeout=30"
$connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
$connection.AccessToken = $response.AccessToken
$connection.Open()

$query="SELECT name, database_id, create_date  FROM sys.databases ; "
$command = New-Object -TypeName System.Data.SqlClient.SqlCommand($query, $connection)   
$Result = $command.ExecuteScalar()
$Result
$connection.Close()

enter image description here

...