Azure sql database 如何使用Azure应用程序许可证(在应用程序清单中定义)作为Azure SQL中的角色

Azure sql database 如何使用Azure应用程序许可证(在应用程序清单中定义)作为Azure SQL中的角色,azure-sql-database,azure-active-directory,role-base-authorization,azure-sql-server,Azure Sql Database,Azure Active Directory,Role Base Authorization,Azure Sql Server,我们的团队希望在Azure门户内注册应用程序时使用应用程序清单中定义的应用程序角色。这是我们TestApp清单上的一个样本 "appRoles": [ { "allowedMemberTypes": [ "User", "Application"], "displayName": "My App Role 2", "id": "0993b354-6b2f-471d-bba2-f7467a1bbbf2", "isEnabled": true,

我们的团队希望在Azure门户内注册应用程序时使用应用程序清单中定义的应用程序角色。这是我们TestApp清单上的一个样本

  "appRoles": [
  { "allowedMemberTypes": [
      "User",
      "Application"],
    "displayName": "My App Role 2",
    "id": "0993b354-6b2f-471d-bba2-f7467a1bbbf2",
    "isEnabled": true,
    "description": "My App Role description for MyAppRole2",
    "value": "MyAppRole2" },
  { "allowedMemberTypes": [
      "User" ],
    "displayName": "My App Role 1",
    "id": "0993b354-6b2f-471d-bba2-f7467a1baaf2",
    "isEnabled": true,
    "description": "My App Role description for MyAppRole1",
    "value": "MyAppRole1" }]
这些应用程序角色在web应用程序中显示为角色声明,允许开发人员通过如下所示装饰端点来控制对端点的访问

[Authorize (Roles = "MyAppRole2")]
public class AdministrationController : Controller
{
}
通过Azure门户(在企业应用程序下),我们可以将用户和/或组分配给特定应用程序的角色,并且一切正常。但是,当尝试直接(从SSM)访问数据库时,应用程序角色的成员身份不起作用

CREATE USER [TestApp] FROM EXTERNAL PROVIDER
CREATE ROLE [MyAppRole2] AUTHORIZATION [TestApp1]
我们也尝试过

CREATE ROLE [My App Role 2] AUTHORIZATION [TestApp1]
在任何一种情况下,在数据库级别检查成员身份都会返回“0”false

SELECT IS_MEMBER('MyAppRole2') [My App Role 2]
但是,如果我们创建一个AAD组(例如“TestApp的我的组我的应用程序角色2”),通过Enterprise Apps界面将“我的应用程序角色2”角色分配给该组,并通过AAD Users and Groups界面将用户分配给该组……我们可以使用SQL中的组来查看该组的成员资格

下面创建Azure SQL与AAD中的组安全主体之间的关系

CREATE USER [My Group For TestApp My App Role 2] FROM EXTERNAL PROVIDER
任何直接登录到该组的SQL的用户都将显示为该组的成员。对于同时也是AAD组成员的经过身份验证的SSMS用户,以下返回true

SELECT IS_MEMBER('My Group For TestApp My App Role 2')
尽管这是可行的,但如果我们从组中删除应用程序角色(在Azure企业应用程序下),上述查询仍然返回true。这是因为用户仍然是组的有效成员,即使该组不再具有对应用程序角色的访问权限。因此,这种变通方法无效,因为数据库实际上没有验证用户是否参与了应用程序角色


我们如何将应用程序角色与数据库角色直接关联以确保适当的安全性?

根据我的理解,您将Azure AD应用程序中定义的应用程序角色与数据库角色混合在一起

如果要使用角色管理Azure广告服务主体。我们可以使用下面的命令创建数据库角色,并将该角色分配给Azure AD中创建的服务主体:

CREATE ROLE customRole2

alter role customRole2 add member FeiTestApp
--FeiTestApp is the service principal in Azure AD
EXECUTE AS USER = 'FeiTestApp';  

SELECT IS_MEMBER('customRole2')
REVERT;
命令应返回
1
,然后我们还可以使用访问令牌检查结果,如下所示:

SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder["Data Source"] = "xxxx.database.windows.net"; // replace with your server name
builder["Initial Catalog"] = "DBTest"; // replace with your database name
builder["Connect Timeout"] = 30;

string authority = "https://login.microsoftonline.com/{0}";
string tenantId = "microsoft.onmicrosoft.com";
string clientId = "";
string secrect = "";
string resourceId = "https://database.windows.net/";
AuthenticationContext authContext = new AuthenticationContext(string.Format(authority,tenantId));
var accessToken=  authContext.AcquireTokenAsync(resourceId, new ClientCredential(clientId, secrect)).Result.AccessToken;

using (SqlConnection connection = new SqlConnection(builder.ConnectionString))
{
    try
    {
        connection.AccessToken = accessToken;
        connection.Open();         
        SqlCommand cmd = new SqlCommand("SELECT IS_MEMBER('customRole2')", connection);

        var reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            Console.WriteLine($"{reader[0]}");              
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message);
    }
}
有关Azure SQL数据库角色管理的更多详细信息,您可以参考以下文档:


Fei,感谢您的消息,但此答案绕过了通过定义的基于Approvles的安全性。这解释了如何在WebApi中使用这些方法作为声明。我只想在SQLServer中使用相同的角色声明。通过这样做,我可以确保对SQL的直接访问。您提到的RBAC功能仅适用于门户,不会传播到SQL Server(请参阅)。如果要使用角色管理SQL server,可以参考本文的第二个链接。