【发布时间】:2017-03-07 15:25:01
【问题描述】:
我有一个针对 Azure Active Directory 对用户进行身份验证的应用程序。然后将返回的 JWT 令牌从应用程序传递到验证令牌的 Web API。
然后,我要求 Active Directory 代表用户为 SQL Azure 生成另一个 JWT 令牌。 Web API 现在可以使用 OnBehalfOf 令牌向 SQL Azure 进行身份验证。从这里开始,数据库通过使用 JWT 中的一些唯一信息来相应地过滤结果来实现 RLS(行级安全性)。
为此,用于请求 onBehalfOf 令牌的 Active Directory 应用程序必须具有 SQL Azure 的 requiredResourceAccess。这是通过在 Azure 门户中编辑应用程序清单来完成的,指定 SQL Azure (022907d3-0f1b-48f7-badc-1ba6abab6d66) 可以访问 Azure SQL DB 和数据仓库 (c39ef2d1-04ce-46dc-8b5f-e9a5c60f0fc9)。
"requiredResourceAccess": [
{
"resourceAppId": "022907d3-0f1b-48f7-badc-1ba6abab6d66",
"resourceAccess": [
{
"id": "c39ef2d1-04ce-46dc-8b5f-e9a5c60f0fc9",
"type": "Scope"
}
]
}
]
我想支持社交登录,Azure B2C 通常更适合我的要求。但是 Azure Active Directory B2C 是否可以支持此身份验证流程?
const string tenant = "...";
const string clientId = "...";
const string clientSecret = "...";
const string connectionString = "Server=...database.windows.net,1433;Initial Catalog=...;Persist Security Info=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False";
async Task Main()
{
try
{
var authenticationContext = new AuthenticationContext(TenantSettings.Authority);
var result = await authenticationContext.AcquireTokenAsync(
"https://database.windows.net/",
new ClientCredential(clientId, clientSecret),
new UserAssertion("eyJ...")).ConfigureAwait(false);
await ConnectToDatabaseAsync(result.AccessToken.Dump());
}
catch (Exception ex)
{
$"Failed to connect to Azure SQL.\n\tReason: {ex.Message}".Dump();
}
}
private static async Task ConnectToDatabaseAsync(string accessToken)
{
using (var connection = new SqlConnection(connectionString))
{
connection.AccessToken = accessToken;
await connection.OpenAsync().ConfigureAwait(false);
using (var command = new SqlCommand("select USER_NAME()", connection))
using (var reader = await command.ExecuteReaderAsync())
{
await reader.ReadAsync().ConfigureAwait(false);
reader.GetString(0).Dump("User");
}
}
}
private static class TenantSettings
{
public const string Authority = Instance + Tenant;
public const string Instance = "https://login.microsoftonline.com/";
public const string Tenant = tenant;
}
【问题讨论】:
-
Tom,您是否将应用程序清单中定义的 appRoles 用作 Azure SQL 中的数据库角色?你能在你的例子中提供你的数据库脚本吗?例如从外部提供商创建用户 X;并且,创建角色 myAppRole AUTHORIZATION X?
-
从外部提供商创建用户 [X] - 是的,这正是我处理它的方式。应用清单中的作用是在获取 SQL Azure 的令牌时启用代表流以供用户访问数据库。飞雪已经确认,很遗憾,B2C 不支持此流程。
-
汤姆,感谢您的回复。我想知道您如何确定 resourceAppId 和 resourceAccess.id 值的 guid。这些 guid 之一是特定天蓝色数据库的对象 ID,而另一个是 Azure SQL 的对象 ID?您可以编辑帖子并提供整个应用清单吗?我认为我们走的是相似的道路,但我将通过使用应用程序的 AAD 信任的第二个 AAD 来避免 B2C。
-
虽然我已经能够使用 AAD 中的组成员资格来限制 SQL 中的访问,但我希望我可以使用应用程序清单中定义的 appRoles 数组作为 SQL 中的标识符(作为角色或校长)。这将允许在 Azure 门户中将用户/组分配给应用程序角色,并在数据层执行这些分配。就像我说的,我有这个为组成员工作,但不适用于应用程序清单 appRoles 数组中定义的应用程序角色。想法?
-
Authenticate public clients to SQL Azure 提供有关使用 AAD 对 SQL Azure 进行身份验证的缺失部分的信息。 022907d3-0f1b-48f7-badc-1ba6abab6d66 是 SQL Azure 的 GUID,c39ef2d1-04ce-46dc-8b5f-e9a5c60f0fc9 是“可以访问 Azure SQL DB 和数据仓库”的 GUID。这些是获取数据库令牌所必需的。
标签: azure azure-active-directory azure-ad-b2c row-level-security