Trong các ứng dụng web hiện đại, việc bảo mật và quản lý quyền truy cập là rất quan trọng. JSON Web Token (JWT) là một giải pháp phổ biến được sử dụng để xác thực và ủy quyền. Bài viết này sẽ giải thích JWT là gì và hướng dẫn cách triển khai JWT trong ASP.NET Blazor và Web API để bảo vệ ứng dụng của bạn.
JSON Web Token (JWT) là gì?
JSON Web Token (JWT) là một chuẩn mở (RFC 7519) định nghĩa một cách thức nhỏ gọn và an toàn để truyền tải thông tin giữa các bên dưới dạng một đối tượng JSON. Thông tin trong JWT có thể được xác thực và tin cậy vì nó được ký số. JWT thường được sử dụng cho việc xác thực và ủy quyền trong các ứng dụng web, đặc biệt là trong các kiến trúc microservices.
JWT gồm ba phần chính:
- Header: Chứa thông tin về loại token và thuật toán mã hóa được sử dụng.
- Payload: Chứa các tuyên bố (claims), là các thông tin về người dùng hoặc quyền hạn của họ.
- Signature: Là phần ký số của token, được tạo ra từ Header, Payload và một khóa bí mật hoặc khóa công khai.
JWT có thể ở dạng mã hóa hoặc không mã hóa, tuy nhiên thông thường chúng không được mã hóa mà chỉ được ký để đảm bảo tính toàn vẹn.
Sử dụng JWT để xác thực và ủy quyền với ASP.NET Blazor và Web API
Khi xây dựng một ứng dụng ASP.NET với Blazor và Web API, JWT có thể được sử dụng để xác thực người dùng và ủy quyền truy cập vào các API bảo mật. Quy trình sử dụng JWT thường bao gồm các bước sau:
-
Đăng nhập và tạo JWT:
- Khi người dùng đăng nhập, ứng dụng sẽ xác thực thông tin đăng nhập (username và password) qua Web API.
- Nếu thông tin đăng nhập hợp lệ, server sẽ tạo ra một JWT chứa thông tin người dùng và các quyền hạn của họ, sau đó trả JWT này về cho client (Blazor app).
-
Lưu trữ JWT:
- JWT có thể được lưu trữ trên client, thông thường là trong
localStorage
hoặcsessionStorage
. Việc này cho phép client sử dụng JWT trong các yêu cầu tiếp theo đến server.
- JWT có thể được lưu trữ trên client, thông thường là trong
-
Xác thực với JWT:
- Mỗi khi client muốn truy cập vào các API bảo mật, JWT sẽ được gửi kèm theo trong phần
Authorization
header của yêu cầu HTTP dưới dạngBearer Token
. - Server sẽ kiểm tra tính hợp lệ của JWT, nếu hợp lệ, server sẽ xác định danh tính của người dùng và kiểm tra quyền truy cập.
- Mỗi khi client muốn truy cập vào các API bảo mật, JWT sẽ được gửi kèm theo trong phần
-
Ủy quyền với JWT:
- Dựa trên thông tin trong JWT, server có thể quyết định cấp quyền hay từ chối truy cập vào các tài nguyên hoặc API cụ thể.
Triển khai JWT trong ASP.NET Blazor và Web API
Dưới đây là cách triển khai cơ bản JWT trong ASP.NET với Blazor và Web API:
-
Cấu hình JWT Authentication trong Web API:
Trong
Startup.cs
hoặcProgram.cs
:public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = "yourIssuer", ValidAudience = "yourAudience", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("yourSecretKey")) }; }); services.AddAuthorization(); services.AddControllers(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
-
Tạo JWT trong Web API:
Khi người dùng đăng nhập thành công:
private string GenerateJwtToken(User user) { var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("yourSecretKey")); var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256); var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, user.Username), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) }; var token = new JwtSecurityToken( issuer: "yourIssuer", audience: "yourAudience", claims: claims, expires: DateTime.Now.AddMinutes(30), signingCredentials: credentials); return new JwtSecurityTokenHandler().WriteToken(token); }
-
Sử dụng JWT trong Blazor:
Khi gọi API từ Blazor, bạn cần đính kèm JWT vào header của yêu cầu:
private async Task<HttpResponseMessage> GetSecuredDataAsync() { var token = await _localStorage.GetItemAsync<string>("authToken"); var client = _httpClientFactory.CreateClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); return await client.GetAsync("https://api.yourwebsite.com/secured-endpoint"); }
-
Xác thực và ủy quyền trong Web API:
Trong các controller của Web API, bạn có thể sử dụng
[Authorize]
để bảo vệ các endpoint yêu cầu xác thực:[Authorize] [ApiController] [Route("api/[controller]")] public class SecuredController : ControllerBase { [HttpGet] public IActionResult GetSecuredData() { return Ok("This is secured data."); } }
Kết luận
JWT là một phương pháp phổ biến và hiệu quả để xác thực và ủy quyền trong các ứng dụng web hiện đại. Khi kết hợp với ASP.NET Blazor và Web API, JWT cho phép xây dựng các ứng dụng có khả năng bảo mật cao và dễ dàng quản lý quyền truy cập của người dùng.
Video triển khai : Authentication and Authorization in Blazor and Web API using JWT
Để biết thêm nhiều nội dung tương tự, hãy theo dõi kênh YouTube của mình nhé: Code Overdose