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ý
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:
- Hướng dẫn: Xây dựng ứng dụng ASP.NET trong Azure với Cơ sở dữ liệu Azure SQL
- Hướng dẫn: Xây dựng ứng dụng ASP.NET Core và Azure SQL Database trong App Service Azure
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.
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, Python và Java), 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:
- Hướng dẫn: Xây dựng ứng dụng ASP.NET trong Azure với Cơ sở dữ liệu SQL
- Hướng dẫn: Xây dựng ứng dụng Cơ sở dữ liệu SQL và ASP.NET Core trong App Service Azure.
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.
- Sử dụng môi trường Bash trong Azure Cloud Shell. Để biết thêm thông tin, hãy xem Khởi động nhanh cho Bash trong Azure 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 File > Account 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 DefaultAzureCredential
như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.
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ý.
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 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