Hướng Dẫn Triển Khai OWIN Xác Thực với Microsoft Entra ID trong ASP.NET Framework
Bài viết này sẽ hướng dẫn bạn cách bảo mật ứng dụng ASP.NET Framework của mình bằng cách sử dụng middleware OWIN và xác thực Microsoft Entra ID (Azure AD). Chúng tôi sẽ đi qua từng bước để tạo ra các endpoint bảo vệ trong khi vẫn duy trì các kiểm tra sức khỏe công khai cho các bộ cân bằng tải.
Mục Tiêu Bài Viết
Mục tiêu của bài viết này là cung cấp cho bạn một hướng dẫn toàn diện về cách triển khai xác thực OWIN với Microsoft Entra ID. Sau khi hoàn thành, bạn sẽ có thể:
- Tạo các endpoint bảo mật trong ứng dụng ASP.NET của mình.
- Thiết lập xác thực sử dụng Azure AD.
- Đảm bảo rằng các yêu cầu không cần xác thực vẫn hoạt động bình thường.
Yêu Cầu
Trước khi bắt đầu, bạn cần có:
- Visual Studio 2022
- Tài khoản Azure Subscription
Mục Lục
- Tạo App Service
- Cấu hình Tên Miền Mặc Định
- Đăng Ký Ứng Dụng trong Microsoft Entra ID
- Cấu Hình Xác Thực
- Tạo Ứng Dụng trong Visual Studio 2022
- Cài Đặt Các Thư Viện Cần Thiết
- Chỉnh Sửa Web.Config
- Tạo Startup.cs
- Tạo Controllers
- Tạo View
- Xuất Bản lên Azure
- Kiểm Tra Ứng Dụng
- Tóm Tắt
Tạo App Service
Trong tài khoản Azure của bạn, hãy tạo một App Service loại Web App. Trong mẫu, bạn sẽ điền dữ liệu cơ bản như sau:
- Chọn tài khoản Azure của bạn
- Tạo một nhóm tài nguyên nếu chưa có
- Đặt tên cho ứng dụng của bạn
- Xuất bản mã trực tiếp từ Visual Studio 2022
- Chọn Runtime là ASP.NET V4.8
- Chọn khu vực và kế hoạch phù hợp với nhu cầu của bạn
- Đối với ví dụ này, hãy chọn khu vực ít người hơn và sử dụng kế hoạch miễn phí.
Sau khi hoàn thành, hãy nhấn vào tùy chọn "Review + Create".
Cấu Hình Tên Miền Mặc Định
Sau khi dịch vụ được tạo, hãy điều hướng đến bảng điều khiển và sao chép giá trị "Default Domain".
Đăng Ký Ứng Dụng trong Microsoft Entra ID
Trong Azure Portal, hãy điều hướng đến Microsoft Entra ID > Quản lý > Đăng ký ứng dụng. Trong cửa sổ này, nhấn vào tùy chọn "New Registration".
Trong cửa sổ này, hãy:
- Đặt tên cho ứng dụng của bạn
- Xác định Tenant nào có thể truy cập ứng dụng
- Đăng ký URI bằng cách sao chép URL ứng dụng App Service dưới dạng "Web"
Cấu Hình Xác Thực
Sau khi đã đăng ký ứng dụng, trong cùng một bảng điều khiển của ứng dụng đã đăng ký, hãy điều hướng đến Quản lý > Xác thực.
Trong cửa sổ này, hãy kích hoạt các tùy chọn sau:
- ID tokens (dùng cho các luồng ẩn danh và hỗn hợp)
- Access tokens (dùng cho các luồng ẩn danh và hỗn hợp)
Tạo Ứng Dụng trong Visual Studio 2022
Tạo một dự án mới với mẫu sau:
- Ứng dụng Web ASP.NET (.NET Framework)
- Chọn Runtime: .NET Framework 4.8
Trong cửa sổ tiếp theo:
- Chọn loại: MVC
- Xác thực: Không (vì Azure sẽ xử lý xác thực)
- Bỏ chọn "Configure for HTTPS"
Cài Đặt Các Thư Viện Cần Thiết
Bây giờ, hãy cài đặt các thư viện cần thiết để chạy dự án. Trong dự án:
- Nhấp chuột phải > Quản lý NuGet Packages cho Giải pháp
Tìm kiếm và cài đặt các gói sau:
- Microsoft.Owin.Security.OpenIdConnect
- Microsoft.Owin.Security.Cookies
- Microsoft.Owin.Host.SystemWeb
- Microsoft.IdentityModel.Protocols.OpenIdConnect
Chỉnh Sửa Web.Config
Sau khi cài đặt các phụ thuộc, hãy bắt đầu chỉnh sửa tệp Web.Config. Trong appSettings, hãy chỉnh sửa các giá trị sau:
Từ Microsoft Entra ID, trong Đăng ký ứng dụng, tìm ứng dụng của bạn và sao chép các giá trị sau:
- ClientID
- TenantID
- RedirectUri (mà bạn đã cấu hình trong App Service)
xml
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="ida:ClientId" value="<your-client-id>" />
<add key="ida:Authority" value="https://login.microsoftonline.com/<your-tenant-id>/v2.0" />
<add key="ida:RedirectUri" value="https://<your-application>.azurewebsites.net/" />
</appSettings>
<system.web>
<authentication mode="None" />
<compilation debug="true" targetFramework="4.8" />
<httpRuntime targetFramework="4.8" />
<customErrors mode="Off"/>
</system.web>
Tạo Startup.cs
Bây giờ, hãy tiến hành tạo một tệp trong thư mục gốc có tên Startup.cs. Tệp này sẽ cung cấp kiểm soát xác thực cho tất cả các yêu cầu.
csharp
using Microsoft.Owin;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security.OpenIdConnect;
using Owin;
using System.Configuration;
[assembly: OwinStartup(typeof(TestAuthApplication.Startup))]
namespace TestAuthApplication
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = ConfigurationManager.AppSettings["ida:ClientId"],
Authority = ConfigurationManager.AppSettings["ida:Authority"],
RedirectUri = ConfigurationManager.AppSettings["ida:RedirectUri"],
ResponseType = "code id_token",
Scope = "openid profile email",
TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
{
ValidateIssuer = false
}
});
}
}
}
Tạo Controllers
Bây giờ, chúng ta sẽ tạo hai controllers: một để kiểm tra sức khỏe cho phép trả về phản hồi 200 mà không cần xác thực, và một trang được bảo vệ.
HealthCheckController.cs (Không Cần Xác Thực)
Trong Controllers > HealthCheckController.cs:
csharp
using System;
using System.Web.Mvc;
namespace TestAuthApplication.Controllers
{
[AllowAnonymous]
public class HealthCheckController : Controller
{
public ActionResult Index()
{
return Json(new
{
status = "healthy",
timestamp = DateTime.UtcNow,
service = "TestAuthApplication"
}, JsonRequestBehavior.AllowGet);
}
public ActionResult Ping()
{
return Content("OK");
}
}
}
Để ngăn chặn xác thực, chúng ta định nghĩa [AllowAnonymous]
.
ProtectedController.cs (Cần Xác Thực)
Bây giờ, chúng ta sẽ tạo một trang được bảo vệ trong Controllers > ProtectedController.cs:
csharp
using System.Web.Mvc;
namespace TestAuthApplication.Controllers
{
[Authorize]
public class ProtectedController : Controller
{
public ActionResult Index()
{
ViewBag.UserName = User.Identity.Name;
return View();
}
public ActionResult SecureData()
{
return Json(new
{
message = "This is protected data",
user = User.Identity.Name
}, JsonRequestBehavior.AllowGet);
}
}
}
Để yêu cầu xác thực, chúng ta định nghĩa [Authorize]
.
Tạo View
Ngoài ra, chúng ta có thể thêm một view cho điều này trong Views > Protected > Index.cshtml:
html
@{
ViewBag.Title = "Protected Page";
}
<h2>Protected Page - Xác Thực Thành Công!</h2>
<p>Chào mừng, @User.Identity.Name!</p>
<p>Bạn đã được xác thực thành công.</p>
<p>Trang này yêu cầu xác thực để truy cập.</p>
Xuất Bản lên Azure
Khi dự án đã sẵn sàng, hãy tiến hành xuất bản:
- Nhấp chuột phải vào dự án > Xuất bản > Azure
- Xác thực với tài khoản người dùng có quyền truy cập vào tài khoản Azure của bạn
- Chọn nhóm tài nguyên và dịch vụ ứng dụng của bạn
- Nhấn Xuất bản
Kiểm Tra Ứng Dụng
Cuối cùng, hãy kiểm tra quyền truy cập:
- Trang không yêu cầu xác thực
- Endpoint kiểm tra sức khỏe nên trả về 200 mà không cần đăng nhập.
- Người dùng đã xác thực trong tenant
- Truy cập thành công các trang được bảo vệ.
- Người dùng đã xác thực nhưng không trong tenant
- Nhận thông báo từ chối quyền truy cập.
Tóm Tắt
- Các endpoint công khai (kiểm tra sức khỏe) không yêu cầu xác thực.
- Các endpoint được bảo vệ yêu cầu xác thực Azure AD.
- Middleware OWIN xử lý luồng xác thực.
- Tích hợp với Azure App Service để lưu trữ.
Các Thực Hành Tốt Nhất
- Luôn bảo mật thông tin xác thực và không lưu trữ chúng trong mã nguồn.
- Sử dụng HTTPS cho mọi giao tiếp với ứng dụng của bạn.
- Đảm bảo kiểm tra các endpoint bảo vệ để ngăn chặn truy cập trái phép.
Các Cạm Bẫy Thường Gặp
- Không cấu hình đúng URI chuyển hướng trong Azure.
- Không kiểm tra các thông báo lỗi từ Azure AD.
Mẹo Hiệu Suất
- Sử dụng caching cho các endpoint không yêu cầu xác thực để cải thiện hiệu suất.
- Theo dõi hiệu suất của ứng dụng qua Azure Monitor để phát hiện sớm vấn đề.
Giải Quyết Sự Cố
- Nếu không thể xác thực, kiểm tra lại ClientID và TenantID trong Web.Config.
- Đảm bảo rằng dịch vụ Azure không bị tắt hoặc gặp sự cố.
Câu Hỏi Thường Gặp
- Tôi có thể sử dụng xác thực OWIN cho ứng dụng không phải ASP.NET được không?
- Có, bạn có thể, nhưng sẽ cần phải điều chỉnh một số cấu hình.
- Có cần phải có tài khoản Azure để triển khai ứng dụng này không?
- Có, bạn cần một tài khoản Azure để sử dụng Microsoft Entra ID.
- Tôi có thể sử dụng xác thực đa yếu tố không?
- Có, Azure AD hỗ trợ xác thực đa yếu tố để tăng cường bảo mật.