2

我們的團隊希望在Azure門戶內註冊應用程序時使用在應用程序清單內定義的應用程序角色。以下是我們TestApp清單中的一個示例。如何使用Azure應用程序appRoles(在應用程序清單中定義)作爲Azure SQL中的角色

"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的門戶網站(在企業應用程序),我們可以分配用戶和/或組角色的具體應用和一切正常。但是,當試圖直接訪問數據庫(來自SSMS)時,應用程序角色的成員資格不起作用。

CREATE USER [TestApp] FROM EXTERNAL PROVIDER 
CREATE ROLE [MyAppRole2] AUTHORIZATION [TestApp1] 

我們也嘗試

CREATE ROLE [My App Role 2] AUTHORIZATION [TestApp1] 

在這兩種情況下,檢查在數據庫級別返回 '0' 假隸屬。

SELECT IS_MEMBER('MyAppRole2') [My App Role 2] 

然而,如果我們創建了一個AAD組(例如,「我的組對於TestApp我的應用角色2」),分配通過企業應用程序界面中的「我的應用角色2」角色到組,並指定用戶通過AAD用戶和組的界面...我們可以通過使用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。這是因爲即使該組不再有權訪問應用程序角色,該用戶仍然是該組的有效成員。因此,此解決方法無效,因爲數據庫實際上未驗證用戶是否參與應用程序角色。

我們如何直接將應用程序角色與數據庫角色相關聯以確保適當的安全性?

回答

0

根據我的理解,您將Azure AD應用中定義的應用程序角色與Application Roles in SQL Server混合在一起。

如果要使用角色管理Azure AD服務主體。我們可以使用命令下面創建一個數據庫角色和分配角色的服務主體創建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數據庫角色管理的更多細節,可以參考文獻:

Principals (Database Engine)

+0

Fei,感謝您的信息,但是此答案繞過了基於[Azure AD和Azure企業應用程序/應用程序註冊]定義的基於應用程序的安全性(https://msdn.microsoft.com/Library/Azure/Ad/Graph/api/實體和 - 複合型基準#approle型)。這篇文章(http://www.dushyantgill.com/blog/2014/12/10/roles-based-access-control-in-cloud-applications-using-azure-ad/)解釋瞭如何使用這些appRoles作爲WebApi內的聲明。我只想在SQL Server中使用相同的角色聲明。通過這樣做,我可以確保直接訪問SQL。 –

+0

您提到的RBAC功能僅適用於門戶網站,並且不會傳播到SQL Server(請參閱[這裏](https://docs.microsoft.com/en-us/azure/sql-database/sql-database-aad-認證配置#創建-AN-Azure的廣告管理員換Azure的SQL服務器))。如果你想用角色管理SQL服務器,你可以參考帖子的第二個鏈接。 –

相關問題