Giới thiệu về Identity trong ASP.NET Core

3 min read

asp.net-identity

ASP.NET Core Identity là một thành phần quan trọng trong việc quản lý xác thực và phân quyền người dùng cho các ứng dụng web được xây dựng bằng ASP.NET Core.

Các điểm nổi bật của ASP.NET Core Identity:

  • Hỗ trợ đa yếu tố xác thực (MFA): Cung cấp khả năng tích hợp dễ dàng cho MFA, giúp tăng cường bảo mật cho tài khoản người dùng.
  • Cải tiến trong quản lý người dùng: Các API mới và được cải thiện giúp bạn dễ dàng tạo, cập nhật và quản lý người dùng.
  • Hỗ trợ OAuth 2.0 và OpenID Connect: Bạn có thể dễ dàng tích hợp với các nhà cung cấp bên ngoài như Google, Facebook, và Microsoft, cung cấp cho người dùng sự linh hoạt trong việc đăng nhập.
  • Tùy chỉnh linh hoạt: Cho phép bạn tùy chỉnh các phương thức xác thực, thông báo, và các yếu tố khác theo nhu cầu của ứng dụng.
  • Cải tiến về hiệu suất: Các tối ưu hóa trong mã nguồn giúp tăng tốc độ và hiệu suất của Identity.

Trong chủ đề này, bạn sẽ học cách sử dụng Identity để đăng ký, đăng nhập và đăng xuất người dùng.

Tạo web app với authentication

Tạo một ASP.NET Core web app với option Individual User Accounts.
Bạn có thể sử dụng Visual Studio:

  • Chọn template ASP.NET Core Web App và setup tên project, folder path.
  • Trong input Authentication type, chọn Individual User Accounts.

Hoặc dùng dotnet cli, câu lệnh dưới đây sẽ tạo ra một Razor web app dùng database SQLite.

dotnet new webapp --auth Individual -o IdentityWebApp

Project được tạo ra sẽ cung cấp sẵn các endpoint và UI cho việc authentication trong area Identity như:

  • /Identity/Account/Login
  • /Identity/Account/Logout
  • /Identity/Account/Manage

Apply migrations

Dùng dotnet cli để cập nhật migration vào database:

dotnet ef database update

Sau khi đã apply các migration mở đầu, các bảng chính trong Identity sẽ được tạo:

Cấu hình Identity services

Các services được đăng ký trong Program.cs. Mẫu để gọi các phương thức sẽ theo thứ tự sau:

  • Add{Service}
  • builder.Services.Configure{Service}
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApp1.Data;

var builder = WebApplication.CreateBuilder(args);

var connectionString = builder.Configuration.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();

builder.Services.Configure<IdentityOptions>(options =>
{
    // Password settings.
    options.Password.RequireDigit = true;
    options.Password.RequireLowercase = true;
    options.Password.RequireNonAlphanumeric = true;
    options.Password.RequireUppercase = true;
    options.Password.RequiredLength = 6;
    options.Password.RequiredUniqueChars = 1;

    // Lockout settings.
    options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(5);
    options.Lockout.MaxFailedAccessAttempts = 5;
    options.Lockout.AllowedForNewUsers = true;

    // User settings.
    options.User.AllowedUserNameCharacters =
    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
    options.User.RequireUniqueEmail = false;
});

builder.Services.ConfigureApplicationCookie(options =>
{
    // Cookie settings
    options.Cookie.HttpOnly = true;
    options.ExpireTimeSpan = TimeSpan.FromMinutes(5);

    options.LoginPath = "/Identity/Account/Login";
    options.AccessDeniedPath = "/Identity/Account/AccessDenied";
    options.SlidingExpiration = true;
});

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();

app.Run();

Đoạn code trên cấu hình Identity với các giá trị mặc định. Identity được kích hoạt bằng cách gọi UseAuthentication. Ban đầu project được generate ra không bao gồm authorization. Ta thêm app.UseAuthorization để đảm bảo đúng thứ tự gọi các middleware. UseRouting, UseAuthenticationUseAuthorization phải được gọi theo đúng thứ tự.

Kết luận

Với ASP.NET Core Identity 8.0, bạn đã có một giải pháp mạnh mẽ để quản lý người dùng trong ứng dụng của mình. Từ việc xác thực đơn giản đến hỗ trợ MFA, mọi thứ đều được tích hợp dễ dàng và bảo mật. Hy vọng rằng bạn sẽ tìm thấy sự tiện lợi và hiệu quả khi sử dụng ASP.NET Core Identity cho dự án của mình!

Reference

https://learn.microsoft.com/en-us/aspnet/core/security/authentication/identity-api-authorization?view=aspnetcore-8.0

Avatar photo

Clean Code: Nguyên tắc viết hàm trong lập trình…

Trong quá trình phát triển phần mềm, việc viết mã nguồn dễ đọc, dễ hiểu là yếu tố then chốt để đảm bảo code...
Avatar photo Dat Tran Thanh
3 min read

Clean Code: Nguyên tắc comment trong lập trình

Trong lập trình, code không chỉ là một tập hợp các câu lệnh để máy tính thực thi, mà còn là một hình thức...
Avatar photo Dat Tran Thanh
3 min read

Clean Code: Nguyên tắc xử lý lỗi (Error Handling)

Trong quá trình phát triển phần mềm, việc xử lý lỗi không chỉ là một phần quan trọng mà còn ảnh hưởng trực tiếp...
Avatar photo Dat Tran Thanh
4 min read

Leave a Reply

Your email address will not be published. Required fields are marked *