来自其他租户的应用程序的Azure SQL AAD身份验证

时间:2020-08-24 21:44:14

标签: sql-server azure powershell azure-active-directory

我正在尝试从多租户AAD应用程序设置另一个对Azure SQL的AAD身份验证,然后从另一个租户那里建立数据库。为此,我创建了:

  1. 租户 A
  2. 中的AAD多租户应用程序test-multitenant
  3. 租户 B 中的服务主体,用于应用程序test-multitenant
  4. 订阅中的Azure SQL数据库test-db,位于租户 B 中。
  5. 租户 B 中的安全组test-group,并将其设置为数据库test-server的SQL Server(test-db)的AAD管理员。
  6. 将租户 B 中的应用程序test-multitenant服务主体添加到test-group安全组中。因此,它具有test-group安全组的所有权限。
  7. 创建了此PowerShell脚本以测试连接性
# get db token
$clientId = '<test-multitenant-app-id>' # test-multitenant
$clientSecret = '<test-multitenant-app-secret>' # test-multitenant
$credentials = [Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential]::new($clientId, $clientSecret)
$tenant = '<tenant-A-id>' # test-multitenant
$authority = "https://login.windows.net/$tenant" 
$context = [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext]::new($authority)
$authTokenTask = $context.AcquireTokenAsync('https://database.windows.net/', $credentials)
$token = $authTokenTask.GetAwaiter().GetResult().AccessToken

# connect
$connectionString = 'Server=test-server.database.windows.net;Initial Catalog=test-db;Integrated Security=false;'
$connection = [System.Data.SqlClient.SQLConnection]::new($connectionString)
$connection.AccessToken = $token
$command = [System.Data.SqlClient.SqlCommand]::new('select count(*) from [dbo].[test]', $connection)
$connection.Open()

$result = $command.ExecuteScalar()

"Result: $result"

不幸的是,我遇到了这个错误

Login failed for user '<token-identified principal>'.

但是有趣的是,如果使用租户 B 的应用程序并执行相同的操作,一切正常。

有人知道Azure SQL和AAD是否支持此方案吗?谢谢

2 个答案:

答案 0 :(得分:1)

请仔细检查您是否正在租户 B 的环境中获取安全令牌。

答案 1 :(得分:1)

这不是事实。您对多租户的概念有误解。

多租户应用程序用于为许多组织提供软件即服务(SaaS)应用程序。这并不意味着原始服务主体可以访问其他已同意的租户的资源。它只能允许那些租户访问他们自己的资源。

多租户应用程序等效于提供开箱即用的功能。即使您有时会以租户A的身份访问租户B的资源,实际上您实际上是在租户B中使用服务主体来访问资源。

因此,在脚本中,将tenant指定为租户B:$tenant = '<tenant-B-id>'