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

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

我正在尝试从 Multi-Tenancy AAD 应用程序和数据库所在的另一个租户设置对 Azure SQL 的 AAD 身份验证。为此我创建了:

  1. 租户 A 中的 AAD Multi-Tenancy 应用程序 test-multitenant
  2. 应用程序test-multitenant的租户B中的服务主体。
  3. 订阅中的 Azure SQL 数据库 test-db,位于租户 B 中。
  4. 租户B中的安全组test-group并将其设置为数据库的SQL Server(test-server)的AAD管理员测试数据库
  5. 将租户 B 中的应用程序 test-multitenant 服务主体添加到 test-group 安全组。所以,它拥有test-group安全组的所有权限。
  6. 创建此 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是否支持这种情况?谢谢

最佳答案

这不是真的。您对 Multi-Tenancy 的概念存在误解。

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

Multi-Tenancy 应用相当于提供了一个开箱即用的功能。即使您有时认为自己正在以租户 A 的身份访问租户 B 的资源,但实际上您是在使用租户 B 中的服务主体来访问资源。

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

关于sql-server - 来自其他租户的应用程序的 Azure SQL AAD 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63569094/

相关文章:

sql - 选择比较两列的案例

sql-server - 等待 AWS RDS native sql 备份完成

sql - 如何在 SQL Server 中批量插入印地语文本

git - 如何直接从 git bash 命令行创建 azure 存储库? (无需进入浏览器)

powershell - 安装 PowerShell 5 后,我可以在版本 3 或 4 模式下运行 PowerShell 吗?

powershell - 基于Windows Server 1709在容器内使用args运行可执行文件

sql - 将动态 SQL 的结果放入 sql-server 的变量中

c# - Azure函数中间件: How to return a custom HTTP response?

azure - 避免在 session 中存储不同 SQL 模式的连接字符串

powershell - powershell-连接N个文本文件,并在每行前添加文件名