Xác thực và bảo mật là các yếu tố quan trọng trong phát triển ứng dụng C#. Trong bài viết này, chúng ta sẽ tìm hiểu cách triển khai xác thực và bảo mật trong một ứng dụng C# bằng cách sử dụng ASP.NET Core, một framework mạnh mẽ để xây dựng các ứng dụng web. Chúng ta sẽ tập trung vào việc sử dụng Identity, JWT (JSON Web Tokens) và ASP.NET Core Middleware để triển khai xác thực và bảo mật.
Bước 1: Cài Đặt Môi Trường Phát Triển
-
Cài đặt .NET Core SDK:
- Tải và cài đặt .NET Core SDK từ trang web chính thức của .NET.
-
Cài đặt Visual Studio hoặc Visual Studio Code:
- Tải và cài đặt Visual Studio từ trang web chính thức của Microsoft.
- Hoặc tải và cài đặt Visual Studio Code từ trang web chính thức của Visual Studio Code.
Bước 2: Tạo Dự Án ASP.NET Core
-
Tạo dự án mới:
- Mở terminal hoặc Command Prompt.
- Sử dụng lệnh sau để tạo một dự án ASP.NET Core Web API:
dotnet new webapi -n SecureApi
- Điều hướng vào thư mục dự án:
cd SecureApi
Bước 3: Thiết Lập ASP.NET Core Identity
-
Cài đặt các gói NuGet:
- Cài đặt các gói cần thiết cho ASP.NET Core Identity:
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore dotnet add package Microsoft.EntityFrameworkCore.SqlServer
-
Cấu hình Identity trong
Startup.cs
:- Mở
Startup.cs
và cấu hình dịch vụ Identity trongConfigureServices
:
using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using SecureApi.Data; public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddIdentity<IdentityUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); services.AddControllers(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } }
- Mở
-
Tạo lớp
ApplicationDbContext
:- Tạo thư mục
Data
và tạo lớpApplicationDbContext
kế thừa từIdentityDbContext
:
using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace SecureApi.Data { public class ApplicationDbContext : IdentityDbContext<IdentityUser> { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } } }
- Tạo thư mục
-
Cập nhật chuỗi kết nối trong
appsettings.json
:- Thêm chuỗi kết nối vào tệp
appsettings.json
:
{ "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-SecureApi;Trusted_Connection=True;MultipleActiveResultSets=true" } }
- Thêm chuỗi kết nối vào tệp
Bước 4: Thiết Lập JWT Authentication
-
Cài đặt gói NuGet:
- Cài đặt gói cần thiết cho JWT:
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
-
Cấu hình JWT trong
Startup.cs
:- Thêm cấu hình JWT trong phương thức
ConfigureServices
:
using Microsoft.IdentityModel.Tokens; using System.Text; public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddIdentity<IdentityUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Issuer"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])) }; }); services.AddControllers(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } }
- Thêm cấu hình JWT trong phương thức
-
Cập nhật
appsettings.json
với cấu hình JWT:{ "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-SecureApi;Trusted_Connection=True;MultipleActiveResultSets=true" }, "Jwt": { "Key": "YourSuperSecretKey", "Issuer": "YourIssuer" } }
Bước 5: Tạo Controller để Xác Thực Người Dùng
-
Tạo
AuthController
:- Tạo một Controller để xử lý xác thực người dùng và cấp phát JWT token.
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Identity; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using System; [Route("api/[controller]")] [ApiController] public class AuthController : ControllerBase { private readonly UserManager<IdentityUser> _userManager; private readonly SignInManager<IdentityUser> _signInManager; private readonly IConfiguration _configuration; public AuthController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager, IConfiguration configuration) { _userManager = userManager; _signInManager = signInManager; _configuration = configuration; } [HttpPost("register")] public async Task<IActionResult> Register([FromBody] RegisterModel model) { var user = new IdentityUser { UserName = model.Username, Email = model.Email }; var result = await _userManager.CreateAsync(user, model.Password); if (result.Succeeded) { return Ok(new { result = "User created successfully" }); } return BadRequest(new { error = result.Errors }); } [HttpPost("login")] public async Task<IActionResult> Login([FromBody] LoginModel model) { var result = await _signInManager.PasswordSignInAsync(model.Username, model.Password, false, false); if (result.Succeeded) { var user = await _userManager.FindByNameAsync(model.Username); var token = GenerateJwtToken(user); return Ok(new { token }); } return Unauthorized(); } private string GenerateJwtToken(IdentityUser user) { var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, user.UserName), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()) }; var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"])); var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); var token = new JwtSecurityToken( issuer: _configuration["Jwt:Issuer"], audience: _configuration["Jwt:Issuer"], claims: claims, expires: DateTime.Now.AddMinutes(30), signingCredentials: creds); return new JwtSecurityTokenHandler().WriteToken(token); } } public class RegisterModel { public string Username { get; set; } public string Email { get; set; } public string Password { get; set; } } public class LoginModel { public string Username { get; set; } public string Password { get; set; } }
Bước 6: Bảo Vệ Endpoint
-
Bảo vệ các endpoint:
- Thêm
[Authorize]
attribute vào các controller hoặc action mà bạn muốn bảo vệ.
[Route("api/[controller]")] [ApiController] [Authorize] public class SecureController : ControllerBase { [HttpGet] public IActionResult Get() { return Ok(new { message = "This is a protected endpoint." }); } }
- Thêm
Bước 7: Chạy Ứng Dụng
-
Chạy ứng dụng:
- Mở terminal hoặc Command Prompt trong thư mục dự án và sử dụng lệnh sau để chạy ứng dụng:
dotnet run
-
Kết quả:
- Sử dụng các công cụ như Postman để gửi các yêu cầu HTTP tới các endpoint
/api/auth/register
,/api/auth/login
và/api/secure
.
- Sử dụng các công cụ như Postman để gửi các yêu cầu HTTP tới các endpoint
Tổng Kết
Bằng cách sử dụng ASP.NET Core Identity, JWT và ASP.NET Core Middleware, bạn có thể triển khai xác thực và bảo mật mạnh mẽ cho ứng dụng C# của mình. Các bước trên cung cấp một hướng dẫn chi tiết về cách cấu hình và bảo vệ các endpoint trong ứng dụng web của bạn.
Comments