Tích hợp Identity Framework để quản lý User & Role trong C# – Phần 22
1. Giới thiệu về Identity Framework
✅ ASP.NET Core Identity là một framework mạnh mẽ để quản lý User, Role và Authentication.
✅ Hỗ trợ đăng nhập, đăng ký, phân quyền, reset mật khẩu, xác thực 2 bước (2FA), v.v.
✅ Tích hợp dễ dàng với Entity Framework Core để lưu thông tin người dùng vào database.
📌 Lợi ích khi sử dụng Identity Framework:
🔹 Không cần tự code xác thực & phân quyền từ đầu.
🔹 Hỗ trợ lưu trữ User & Role trong SQL Server.
🔹 Tích hợp bảo mật nâng cao như Hash Password, Token Authentication.
2. Cài đặt ASP.NET Core Identity
Bước 1: Cài đặt gói NuGet
Mở terminal hoặc NuGet Package Manager và chạy lệnh sau:
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore
dotnet add package Microsoft.AspNetCore.Identity.UI
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
3. Cấu hình Identity Framework
Bước 2: Thêm DbContext và cấu hình Database
📌 Mở ApplicationDbContext.cs và kế thừa từ IdentityDbContext
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
public class ApplicationDbContext : IdentityDbContext<IdentityUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
}
📌 Mở appsettings.json và thêm cấu hình Connection String
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=IdentityDB;Trusted_Connection=True;MultipleActiveResultSets=true"
}
4. Đăng ký Identity trong Program.cs
📌 Thêm Identity vào Program.cs
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
builder.Services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
app.UseAuthentication(); // Kích hoạt Authentication
app.UseAuthorization(); // Kích hoạt Authorization
app.MapControllers();
app.Run();
📌 Giải thích:
✅ AddIdentity<IdentityUser, IdentityRole>(): Kích hoạt User & Role.
✅ AddEntityFrameworkStores<ApplicationDbContext>(): Lưu User vào database.
✅ AddDefaultTokenProviders(): Hỗ trợ reset password, email confirm.
5. Chạy Migration để tạo Database
📌 Chạy lệnh sau để tạo bảng User & Role trong SQL Server
dotnet ef migrations add CreateIdentitySchema
dotnet ef database update
📌 Kết quả:
✅ Các bảng như AspNetUsers, AspNetRoles, AspNetUserRoles sẽ được tạo trong database.
6. Tạo API Đăng Ký & Đăng Nhập Người Dùng
📌 Tạo AuthController.cs để xử lý đăng ký & đăng nhập
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
[Route("api/auth")]
[ApiController]
public class AuthController : ControllerBase
{
private readonly UserManager<IdentityUser> _userManager;
private readonly SignInManager<IdentityUser> _signInManager;
public AuthController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager)
{
_userManager = userManager;
_signInManager = signInManager;
}
[HttpPost("register")]
public async Task<IActionResult> Register([FromBody] RegisterModel model)
{
var user = new IdentityUser { UserName = model.Email, Email = model.Email };
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
return Ok(new { message = "Đăng ký thành công!" });
}
return BadRequest(result.Errors);
}
[HttpPost("login")]
public async Task<IActionResult> Login([FromBody] LoginModel model)
{
var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, false, false);
if (result.Succeeded)
{
return Ok(new { message = "Đăng nhập thành công!" });
}
return Unauthorized();
}
}
public class RegisterModel
{
public string Email { get; set; }
public string Password { get; set; }
}
public class LoginModel
{
public string Email { get; set; }
public string Password { get; set; }
}
📌 Giải thích:
✅ API /api/auth/register để tạo tài khoản.
✅ API /api/auth/login để đăng nhập.
7. Tạo API Thêm Role và Phân quyền User
📌 Tạo RoleController.cs để quản lý Role
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
[Route("api/role")]
[ApiController]
public class RoleController : ControllerBase
{
private readonly RoleManager<IdentityRole> _roleManager;
private readonly UserManager<IdentityUser> _userManager;
public RoleController(RoleManager<IdentityRole> roleManager, UserManager<IdentityUser> userManager)
{
_roleManager = roleManager;
_userManager = userManager;
}
[HttpPost("create")]
public async Task<IActionResult> CreateRole([FromBody] string roleName)
{
var roleExist = await _roleManager.RoleExistsAsync(roleName);
if (!roleExist)
{
var result = await _roleManager.CreateAsync(new IdentityRole(roleName));
if (result.Succeeded)
return Ok(new { message = $"Role {roleName} đã được tạo thành công!" });
}
return BadRequest(new { message = "Role đã tồn tại!" });
}
[HttpPost("assign")]
public async Task<IActionResult> AssignRole([FromBody] UserRoleModel model)
{
var user = await _userManager.FindByEmailAsync(model.Email);
if (user == null) return NotFound(new { message = "User không tồn tại!" });
var result = await _userManager.AddToRoleAsync(user, model.Role);
if (result.Succeeded)
return Ok(new { message = $"User {model.Email} đã được gán quyền {model.Role}!" });
return BadRequest(result.Errors);
}
}
public class UserRoleModel
{
public string Email { get; set; }
public string Role { get; set; }
}
📌 Giải thích:
✅ /api/role/create để tạo role mới.
✅ /api/role/assign để gán quyền cho user.
8. Kiểm thử API Identity
Đăng ký tài khoản
🔹 Gửi POST request đến /api/auth/register
{
"email": "admin@example.com",
"password": "Admin@123"
}
Thêm Role
🔹 Gửi POST request đến /api/role/create với body:
"Admin"
Gán quyền cho User
🔹 Gửi POST request đến /api/role/assign
{
"email": "admin@example.com",
"role": "Admin"
}
9. Tổng Kết
✅ ASP.NET Core Identity giúp quản lý User & Role dễ dàng.
✅ Sử dụng API để đăng ký, đăng nhập và phân quyền user.
✅ Có thể mở rộng để xác thực với JWT Token, OAuth, Google, Facebook.
📌 Bài tiếp theo:
👉 Tích hợp Identity với JWT Authentication trong C# – Phần 23 🚀