×

Triển Khai Xác Thực và Bảo Mật Trong Ứng Dụng C# với ASP.NET Core

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

  1. Cài đặt .NET Core SDK:

  2. Cài đặt Visual Studio hoặc Visual Studio Code:

Bước 2: Tạo Dự Án ASP.NET Core

  1. 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

  1. 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
    
  2. Cấu hình Identity trong Startup.cs:

    • Mở Startup.cs và cấu hình dịch vụ Identity trong ConfigureServices:
    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();
            });
        }
    }
    
  3. Tạo lớp ApplicationDbContext:

    • Tạo thư mục Data và tạo lớp ApplicationDbContext 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)
            {
            }
        }
    }
    
  4. 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"
        }
    }
    

Bước 4: Thiết Lập JWT Authentication

  1. Cài đặt gói NuGet:

    • Cài đặt gói cần thiết cho JWT:
    dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
    
  2. 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();
            });
        }
    }
    
  3. 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

  1. 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

  1. 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." });
        }
    }
    

Bước 7: Chạy Ứng Dụng

  1. 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
    
  2. 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/api/secure.

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