ASP.NET Core: Kết nối với SQL từ App Service .NET mà không cần bảo mật bằng cách sử dụng danh tính được quản lý


Khóa học qua video:
Lập trình Python All C# Lập trình C Java SQL Server PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên

App Service cung cấp dịch vụ lưu trữ web tự vá, có khả năng mở rộng cao trong Azure. Nó cũng cung cấp danh tính được quản lý cho ứng dụng của bạn, đây là giải pháp chìa khóa trao tay để đảm bảo quyền truy cập vào Cơ sở dữ liệu Azure SQL và các dịch vụ Azure khác. Danh tính được quản lý trong App Service giúp ứng dụng của bạn an toàn hơn bằng cách loại bỏ các bí mật khỏi ứng dụng của bạn, chẳng hạn như thông tin xác thực trong chuỗi kết nối. Trong hướng dẫn này, bạn thêm danh tính được quản lý vào ứng dụng web mẫu mà bạn đã tạo trong một trong các hướng dẫn sau:

Khi bạn hoàn tất, ứng dụng mẫu của bạn sẽ kết nối an toàn với Cơ sở dữ liệu SQL mà không cần tên người dùng và mật khẩu.

Sơ đồ kiến ​​trúc cho kịch bản hướng dẫn.

Ghi chú

Các bước trong hướng dẫn này hỗ trợ các phiên bản sau:

  • .NET Framework 4.8 trở lên
  • .NET 6.0 trở lên

Để biết hướng dẫn về Cơ sở dữ liệu Azure cho MySQL hoặc Cơ sở dữ liệu Azure cho PostgreSQL trong các khung ngôn ngữ khác (Node.js, PythonJava), hãy xem Hướng dẫn: Kết nối với cơ sở dữ liệu Azure từ App Service mà không cần bảo mật bằng danh tính được quản lý.

Những gì bạn sẽ học:

  • Bật danh tính được quản lý
  • Cấp quyền truy cập Cơ sở dữ liệu SQL cho danh tính được quản lý
  • Định cấu hình Entity Framework để sử dụng xác thực Azure AD với Cơ sở dữ liệu SQL
  • Kết nối với Cơ sở dữ liệu SQL từ Visual Studio bằng xác thực Azure AD

Ghi chú

Xác thực Azure AD khác với xác thực Windows tích hợp trong Active Directory (AD DS) tại chỗ. AD DS và Azure AD sử dụng các giao thức xác thực hoàn toàn khác nhau. Để biết thêm thông tin, hãy xem tài liệu Dịch vụ Miền Azure AD.

Nếu bạn chưa có đăng ký Azure, hãy tạo một tài khoản Azure miễn phí trước khi bắt đầu.

Điều kiện tiên quyết

Bài viết này tiếp tục nơi bạn đã dừng lại ở một trong các hướng dẫn sau:

Nếu bạn chưa làm, hãy làm theo một trong hai hướng dẫn trên. Ngoài ra, bạn có thể điều chỉnh các bước cho ứng dụng .NET của riêng mình với Cơ sở dữ liệu SQL.

Để gỡ lỗi ứng dụng của bạn bằng cách sử dụng Cơ sở dữ liệu SQL làm phần cuối, hãy đảm bảo rằng bạn đã cho phép kết nối máy khách từ máy tính của mình. Nếu không, hãy thêm IP máy khách bằng cách làm theo các bước tại Quản lý quy tắc tường lửa IP cấp máy chủ bằng cổng Azure.

Chuẩn bị môi trường của bạn cho Azure CLI.

Launch Cloud Shell

  • Nếu bạn muốn chạy các lệnh tham chiếu CLI cục bộ, hãy cài đặt Azure CLI. Nếu bạn đang chạy trên Windows hoặc macOS, hãy cân nhắc chạy Azure CLI trong bộ chứa Docker. Để biết thêm thông tin, hãy xem Cách chạy Azure CLI trong bộ chứa Docker.
    • Nếu bạn đang sử dụng cài đặt cục bộ, hãy đăng nhập vào Azure CLI bằng cách sử dụng lệnh đăng nhập az. Để kết thúc quá trình xác thực, hãy làm theo các bước được hiển thị trong thiết bị đầu cuối của bạn. Để biết các tùy chọn đăng nhập khác, hãy xem Đăng nhập bằng Azure CLI.
    • Khi bạn được nhắc, hãy cài đặt tiện ích mở rộng Azure CLI trong lần sử dụng đầu tiên. Để biết thêm thông tin về tiện ích mở rộng, hãy xem Sử dụng tiện ích mở rộng với Azure CLI.
    • Chạy phiên bản az để tìm phiên bản và các thư viện phụ thuộc đã được cài đặt. Để nâng cấp lên phiên bản mới nhất, hãy chạy nâng cấp az.

I. Cấp quyền truy cập cơ sở dữ liệu cho người dùng Azure AD

Trước tiên, hãy bật xác thực Azure Active Directory cho Cơ sở dữ liệu SQL bằng cách chỉ định người dùng Azure AD làm quản trị viên của máy chủ. Người dùng này khác với tài khoản Microsoft mà bạn đã sử dụng để đăng ký gói đăng ký Azure của mình. Đó phải là người dùng mà bạn đã tạo, nhập, đồng bộ hóa hoặc mời vào Azure AD. Để biết thêm thông tin về người dùng Azure AD được phép, hãy xem các tính năng và giới hạn của Azure AD trong Cơ sở dữ liệu SQL.

1. Nếu đối tượng thuê Azure AD của bạn chưa có người dùng, hãy tạo một người dùng bằng cách làm theo các bước tại Thêm hoặc xóa người dùng bằng Azure Active Directory.

2. Tìm ID đối tượng của người dùng Azure AD bằng cách sử dụng az ad user list và thay thế <user-principal-name>. Kết quả được lưu vào một biến.

$azureaduser=(az ad user list --filter "userPrincipalName eq '<user-principal-name>'" --query '[].id' --output tsv)

Mẹo

Để xem danh sách tất cả tên chính của người dùng trong Azure AD, hãy chạy az ad user list --query '[].userPrincipalName'.

3. Thêm người dùng Azure AD này làm quản trị viên Active Directory bằng az sql server ad-admin createlệnh trong Cloud Shell. Trong lệnh sau, thay thế <server-name> bằng tên máy chủ (không có hậu tố .database.windows.net).

az sql server ad-admin create --resource-group myResourceGroup --server-name <server-name> --display-name ADMIN --object-id $azureaduser

Để biết thêm thông tin về cách thêm quản trị viên Active Directory, hãy xem Cung cấp quản trị viên Azure Active Directory cho máy chủ của bạn

II. Thiết lập môi trường nhà phát triển của bạn

Visual Studio Windows

1. Visual Studio cho Windows được tích hợp với xác thực Azure AD. Để cho phép phát triển và gỡ lỗi trong Visual Studio, hãy thêm người dùng Azure AD của bạn vào Visual Studio bằng cách chọn FileAccount Settings từ menu và chọn Sign in hoặc Add.

2. Để đặt người dùng Azure AD cho xác thực dịch vụ Azure, hãy chọn Tools > Options từ menu, sau đó chọn Azure Service Authentication > Account Selection. Chọn người dùng Azure AD mà bạn đã thêm và chọn OK.

Visual Studio cho macOS

1. Visual Studio cho Mac không được tích hợp với xác thực Azure AD. Tuy nhiên, thư viện máy khách Azure Identity mà bạn sẽ sử dụng sau này có thể sử dụng mã thông báo từ Azure CLI. Để cho phép phát triển và gỡ lỗi trong Visual Studio, hãy cài đặt Azure CLI trên máy cục bộ của bạn.

2. Đăng nhập vào Azure CLI bằng lệnh sau bằng người dùng Azure AD của bạn:

az login --allow-no-subscriptions

Visual Studio Code

1. Visual Studio Code được tích hợp với xác thực Azure AD thông qua tiện ích mở rộng Azure. Cài đặt tiện ích mở rộng Công cụ Azure trong Visual Studio Code.

2. Trong Visual Studio Code, trong Activity Bar, hãy chọn biểu tượng Azure.

3. Trong App Service explorer, chọn Sign in to Azure... và làm theo hướng dẫn.

Azure CLI

1. Thư viện máy khách Azure Identity mà bạn sẽ sử dụng sau này có thể sử dụng mã thông báo từ Azure CLI. Để kích hoạt phát triển dựa trên dòng lệnh, hãy cài đặt Azure CLI trên máy cục bộ của bạn.

2. Đăng nhập vào Azure bằng lệnh sau bằng người dùng Azure AD của bạn:

az login --allow-no-subscriptions

Azure PowerShell:

1. Thư viện máy khách Azure Identity mà bạn sẽ sử dụng sau này có thể sử dụng mã thông báo từ Azure PowerShell. Để kích hoạt phát triển dựa trên dòng lệnh, hãy cài đặt Azure PowerShell trên máy cục bộ của bạn.

2. Đăng nhập vào Azure CLI bằng lệnh ghép ngắn sau bằng người dùng Azure AD của bạn:

Connect-AzAccount

Để biết thêm thông tin về cách thiết lập môi trường nhà phát triển của bạn để xác thực Azure Active Directory, hãy xem thư viện máy khách Azure Identity dành cho .NET.

Bây giờ, bạn đã sẵn sàng phát triển và gỡ lỗi ứng dụng của mình với Cơ sở dữ liệu SQL làm phần cuối, sử dụng xác thực Azure AD.

III. Sửa đổi dự án của bạn

Ghi chú

Microsoft.Azure.Services.AppAuthentication không còn được khuyến nghị sử dụng với Azure SDK mới. Nó được thay thế bằng thư viện máy khách Azure Identity mới có sẵn cho .NET, Java, TypeScript và Python và nên được sử dụng cho tất cả sự phát triển mới. Bạn có thể tìm thấy thông tin về cách di chuyển Azure Identity tại đây: AppAuthentication to Azure.Identity Migration Guidance.

Các bước bạn thực hiện cho dự án của mình tùy thuộc vào việc bạn đang sử dụng Entity Framework (mặc định cho ASP.NET) hay Entity Framework Core (mặc định cho ASP.NET Core).

Với Entity Framework

1. Trong Visual Studio, hãy mở Package Manager Console và thêm gói NuGet Azure.Identity và cập nhật Entity Framework:

Install-Package Azure.Identity
Update-Package EntityFramework

2. Trong đối tượng DbContext của bạn (trong Models/MyDbContext.cs), hãy thêm đoạn mã sau vào hàm tạo mặc định.

var conn = (System.Data.SqlClient.SqlConnection)Database.Connection;
var credential = new Azure.Identity.DefaultAzureCredential();
var token = credential.GetToken(new Azure.Core.TokenRequestContext(new[] { "https://database.windows.net/.default" }));
conn.AccessToken = token.Token;

Đoạn code trên sử dụng Azure.Identity.DefaultAzureCredential để nhận mã thông báo có thể sử dụng cho Cơ sở dữ liệu SQL từ Azure Active Directory, sau đó thêm nó vào kết nối cơ sở dữ liệu. Mặc dù bạn có thể tùy chỉnh DefaultAzureCredentialnhưng theo mặc định, tính năng này đã rất linh hoạt. Khi chạy trong App Service, nó sử dụng danh tính được quản lý do hệ thống chỉ định của ứng dụng. Khi chạy cục bộ, nó có thể nhận mã thông báo bằng cách sử dụng danh tính đã đăng nhập của Visual Studio, Visual Studio Code, Azure CLI và Azure PowerShell.

3. Trong Web.config, tìm chuỗi kết nối được gọi là MyDbConnection và thay thế giá trị connectionString của nó bằng "server=tcp:<server-name>.database.windows.net;database=<db-name>;". Thay thế <server-name> và <db-name> bằng tên máy chủ và tên cơ sở dữ liệu của bạn. Chuỗi kết nối này được sử dụng bởi hàm tạo mặc định trong Models/MyDbContext.cs.

Đó là mọi thứ bạn cần để kết nối với Cơ sở dữ liệu SQL. Khi bạn gỡ lỗi trong Visual Studio, mã của bạn sử dụng người dùng Azure AD mà bạn đã định cấu hình trong phần 2. Thiết lập môi trường nhà phát triển của bạn. Bạn sẽ thiết lập Cơ sở dữ liệu SQL sau để cho phép kết nối từ danh tính được quản lý của ứng dụng App Service của bạn.

4. Nhấn Ctrl+F5 để chạy lại ứng dụng. Ứng dụng CRUD tương tự trong trình duyệt của bạn hiện đang kết nối trực tiếp với Cơ sở dữ liệu Azure SQL, sử dụng xác thực Azure AD. Thiết lập này cho phép bạn chạy di chuyển cơ sở dữ liệu từ Visual Studio.

Với Entity Framework Core

1. Trong Visual Studio, hãy mở Package Manager Console và thêm gói NuGet Microsoft.Data.SqlClient:

Install-Package Microsoft.Data.SqlClient -Version 5.1.0

2. Trong hướng dẫn Cơ sở dữ liệu SQL và ASP.NET Core, chuỗi kết nối MyDbConnection trong appsettings.json hoàn toàn chưa được sử dụng. Cả môi trường cục bộ và môi trường Azure đều nhận các chuỗi kết nối từ các biến môi trường tương ứng của chúng để giữ bảo mật kết nối khỏi tệp nguồn. Nhưng giờ đây với xác thực Active Directory thì sẽ không còn bảo mật nào nữa. Trong appsettings.json, bạn thay thế giá trị của chuỗi kết nối MyDbConnection bằng:

"Server=tcp:<server-name>.database.windows.net;Authentication=Active Directory Default; Database=<database-name>;"

Ghi chú

Loại xác thực Mặc định của Active Directory có thể được sử dụng cả trên máy cục bộ của bạn và trong App Service Azure. Trình điều khiển cố gắng lấy mã thông báo từ Azure Active Directory bằng nhiều cách khác nhau. Nếu ứng dụng được triển khai, ứng dụng sẽ nhận được mã thông báo từ danh tính được quản lý của ứng dụng. Nếu ứng dụng đang chạy cục bộ, ứng dụng sẽ cố lấy mã thông báo từ Visual Studio, Visual Studio Code và Azure CLI.

Đó là mọi thứ bạn cần để kết nối với Cơ sở dữ liệu SQL. Khi bạn gỡ lỗi trong Visual Studio, mã của bạn sử dụng người dùng Azure AD mà bạn đã định cấu hình trong phần 2. Thiết lập môi trường nhà phát triển của bạn. Bạn sẽ thiết lập Cơ sở dữ liệu SQL sau để cho phép kết nối từ danh tính được quản lý của ứng dụng App Service của bạn. Lớp DefaultAzureCredential lưu trữ mã thông báo trong bộ nhớ và truy xuất nó từ Azure AD ngay trước khi hết hạn. Bạn không cần bất kỳ mã tùy chỉnh nào để làm mới mã thông báo.

3. Nhấn Ctrl+F5 để chạy lại ứng dụng. Ứng dụng CRUD tương tự trong trình duyệt của bạn hiện đang kết nối trực tiếp với Cơ sở dữ liệu Azure SQL, sử dụng xác thực Azure AD. Thiết lập này cho phép bạn chạy di chuyển cơ sở dữ liệu từ Visual Studio.

IV. Sử dụng kết nối danh tính được quản lý

Tiếp theo, bạn định cấu hình ứng dụng App Service của mình để kết nối với Cơ sở dữ liệu SQL với danh tính được quản lý do hệ thống chỉ định.

Ghi chú

Mặc dù các hướng dẫn trong phần này dành cho danh tính do hệ thống chỉ định, nhưng danh tính do người dùng chỉ định có thể dễ dàng được sử dụng. Để làm điều này bạn sẽ cần thay đổi az webapp identity assign command để chỉ định danh tính do người dùng chỉ định mong muốn. Sau đó, khi tạo người dùng SQL, hãy đảm bảo sử dụng tên của tài nguyên nhận dạng do người dùng gán thay vì tên trang web.

Bật danh tính được quản lý trên ứng dụng

Để bật danh tính được quản lý cho ứng dụng Azure của bạn, hãy sử dụng lệnh gán danh tính ứng dụng web az trong Cloud Shell. Trong lệnh sau, thay thế <app-name>.

az webapp identity assign --resource-group myResourceGroup --name <app-name>

Ghi chú

Để bật danh tính được quản lý cho vị trí triển khai, hãy thêm --slot <slot-name> và sử dụng tên của vị trí trong <slot-name>.

Đây là một ví dụ về đầu ra:

{
  "additionalProperties": {},
  "principalId": "21dfa71c-9e6f-4d17-9e90-1d28801c9735",
  "tenantId": "72f988bf-86f1-41af-91ab-2d7cd011db47",
  "type": "SystemAssigned"
}

Cấp quyền cho danh tính được quản lý

Ghi chú

Nếu muốn, bạn có thể thêm danh tính vào nhóm Azure AD, sau đó cấp quyền truy cập Cơ sở dữ liệu SQL cho nhóm Azure AD thay vì danh tính. Ví dụ: các lệnh sau thêm danh tính được quản lý từ bước trước đó vào một nhóm mới có tên myAzureSQLDBAccessGroup:

$groupid=(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
$msiobjectid=(az webapp identity show --resource-group myResourceGroup --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid

1. Trong Cloud Shell, đăng nhập vào Cơ sở dữ liệu SQL bằng cách sử dụng lệnh SQLCMD. Thay thế <server-name> bằng tên máy chủ của bạn, <db-name> bằng tên cơ sở dữ liệu mà ứng dụng của bạn sử dụng và <aad-user-name> và <aad-password> bằng thông tin xác thực người dùng Azure AD của bạn.

sqlcmd -S <server-name>.database.windows.net -d <db-name> -U <aad-user-name> -P "<aad-password>" -G -l 30

2. Trong lời nhắc SQL cho cơ sở dữ liệu bạn muốn, hãy chạy các lệnh sau để cấp các quyền tối thiểu mà ứng dụng của bạn cần. Ví dụ,

CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
ALTER ROLE db_ddladmin ADD MEMBER [<identity-name>];
GO

<identity-name> là tên của danh tính được quản lý trong Azure AD. Nếu danh tính được chỉ định bởi hệ thống, thì tên này luôn giống với tên của ứng dụng App Service của bạn. Đối với vị trí triển khai, tên nhận dạng do hệ thống chỉ định của vị trí đó là <app-name>/slots/<slot-name>. Để cấp quyền cho nhóm Azure AD, thay vào đó hãy sử dụng tên hiển thị của nhóm (ví dụ: myAzureSQLDBAccessGroup).

3. Nhập EXIT để quay lại dấu nhắc Cloud Shell.

Ghi chú

Các dịch vụ phụ trợ của các danh tính được quản lý cũng duy trì một bộ đệm mã thông báo chỉ cập nhật mã thông báo cho tài nguyên đích khi nó hết hạn. Nếu bạn mắc lỗi khi định cấu hình quyền Cơ sở dữ liệu SQL của mình và cố gắng sửa đổi quyền sau khi cố lấy mã thông báo bằng ứng dụng của mình, thì bạn sẽ không thực sự nhận được mã thông báo mới với quyền được cập nhật cho đến khi mã thông báo được lưu trong bộ nhớ cache hết hạn.

Ghi chú

Azure Active Directory và danh tính được quản lý không được hỗ trợ cho SQL Server tại chỗ.

Sửa đổi chuỗi kết nối

Hãy nhớ rằng những thay đổi tương tự mà bạn đã thực hiện trong Web.config hoặc appsettings.json hoạt động với danh tính được quản lý, vì vậy điều duy nhất cần làm là xóa chuỗi kết nối hiện có trong App Service mà Visual Studio đã tạo khi triển khai ứng dụng của bạn lần đầu tiên. Sử dụng lệnh sau nhưng thay <app-name> bằng tên ứng dụng của bạn.

az webapp config connection-string delete --resource-group myResourceGroup --name <app-name> --setting-names MyDbConnection

V. Xuất bản các thay đổi của bạn


Tất cả những gì còn lại bây giờ là xuất bản các thay đổi của bạn lên Azure.

Với ASP.NET

1. Nếu bạn đến từ Hướng dẫn: Xây dựng ứng dụng ASP.NET trong Azure với Cơ sở dữ liệu SQL, hãy xuất bản các thay đổi của bạn trong Visual Studio. Trong Solution Explorer, nhấp chuột phải vào dự án DotNetAppSqlDb của bạn và chọn Publish.

Xuất bản từ Solution Explorer

2. Trong trang xuất bản, chọn Publish.

Quan trọng

Đảm bảo rằng tên App Service của bạn không khớp với bất kỳ Đăng ký ứng dụng hiện có nào. Điều này sẽ dẫn đến xung đột ID Principal.

Với ASP.NET Core

Nếu bạn đến từ Hướng dẫn: Xây dựng ứng dụng Cơ sở dữ liệu SQL và ASP.NET Core trong Azure App Service, hãy xuất bản các thay đổi của bạn bằng Git, với các lệnh sau:

git commit -am "configure managed identity"
git push azure main

Khi trang web mới hiển thị danh sách việc cần làm của bạn, ứng dụng của bạn đang kết nối với cơ sở dữ liệu bằng danh tính được quản lý.

Ứng dụng Azure sau khi Code First Migration

Bây giờ bạn có thể chỉnh sửa danh sách việc cần làm như trước đây.

Làm sạch tài nguyên

Trong các bước trước, bạn đã tạo tài nguyên Azure trong một nhóm tài nguyên. Nếu bạn không muốn các tài nguyên này trong tương lai, hãy xóa nhóm tài nguyên bằng cách chạy lệnh sau trong Cloud Shell:

az group delete --name myResourceGroup

Lệnh này có thể mất một phút để chạy.

Bước tiếp theo

Những gì bạn đã học được:

  • Bật danh tính được quản lý
  • Cấp quyền truy cập Cơ sở dữ liệu SQL cho danh tính được quản lý
  • Định cấu hình Entity Framework để sử dụng xác thực Azure AD với Cơ sở dữ liệu SQL
  • Kết nối với Cơ sở dữ liệu SQL từ Visual Studio bằng xác thực Azure AD

 Bảo mật với tên miền và chứng chỉ tùy chỉnh

Hướng dẫn: Kết nối ứng dụng Dịch vụ ứng dụng với Cơ sở dữ liệu SQL thay mặt cho người dùng đã đăng nhập

Hướng dẫn: Kết nối với cơ sở dữ liệu Azure từ Dịch vụ ứng dụng mà không cần bí mật bằng cách sử dụng danh tính được quản lý

Hướng dẫn: Kết nối với các dịch vụ Azure không hỗ trợ danh tính được quản lý (sử dụng Key Vault)

Hướng dẫn: Cách ly giao tiếp back-end với tích hợp Mạng ảo

Nguồn: learn.microsoft.com
» Tiếp: Biến môi trường và cài đặt ứng dụng trong App Service Azure
« Trước: Bảo mật ứng dụng App Service Azure bằng miền tùy chỉnh và chứng chỉ được quản lý
Khóa học qua video:
Lập trình Python All C# Lập trình C Java SQL Server PHP HTML5-CSS3-JavaScript
Đăng ký Hội viên
Tất cả các video dành cho hội viên
Copied !!!