hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
    • Cấu trúc dữ liệu và giải thuật
    • Lập Trình C# Cơ Bản
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • ASP.NET Core MVC
Đăng nhập và xác thực người dùng với ASP.NET Core Identity

Đăng nhập và xác thực người dùng với ASP.NET Core Identity

  • 01-07-2025
  • Toanngo92
  • 0 Comments

Mục lục

    • 14.1 Giới thiệu về Danh tính và Đăng nhập Người dùng
        • Tầm quan trọng của danh tính người dùng
      • Các loại danh tính người dùng
    • 14.2 Tìm hiểu về Đăng nhập Người dùng
      • 14.2.1 Quy trình Xác thực
      • 14.2.2 Tầm quan trọng của cơ chế đăng nhập an toàn
    • 14.3 Bảo mật mật khẩu
      • Password Hashing (Băm mật khẩu):
      • Salted Hashing:
    • Password Policies và Quy tắc Độ phức tạp
    • 14.4 Session State trong ASP.NET Core
      • Vai trò chính của Session:
    • 14.4.1 Triển khai Session State trong ASP.NET Core
      • Code Snippet 1
    • Trong phần triển khai này:
    • Phân tích chi tiết đoạn triển khai:
      • 1. Phương thức AddSession:
      • 2. Middleware UseSession:
      • 3. Tùy chỉnh các tùy chọn session:
  • 14.5 Quản lý User Identity và Bảo mật với Ứng dụng Mẫu
    • Bước 1: Tạo một dự án ASP.NET Core mới
    • Bước 2: Thiết lập ASP.NET Core Identity
    • Bước 3: Thiết lập Controller Classes
    • Bước 4: Thiết lập DbContext
    • Bước 5: Định nghĩa lớp ApplicationUser
    • Bước 6: Định nghĩa Login View Model và Register Model Class
    • Bước 7: Tạo các file cshtml cho Login và Register
    • Tạo Partial View cho Login/Logout
    • ✅ Bước 8: Cấu hình các dịch vụ trong tệp Program.cs
    • ✅ Tệp cấu hình: appsettings.json (Hình 14.3)
    • Hình 14.4: Solution Explorer của Dự án
    • Hình 14.5: Lệnh Migration
    • Hình 14.6: Giao diện Đăng Nhập (Login View)
    • Hình 14.7: Giao diện Đăng Ký (Register View)

14.1 Giới thiệu về Danh tính và Đăng nhập Người dùng

User Identity (Danh tính người dùng) đề cập đến thông tin liên kết với một người dùng cụ thể trong một hệ thống hoặc ứng dụng. Nó bao gồm các thuộc tính và đặc điểm giúp nhận diện người dùng một cách duy nhất, đồng thời xác định quyền truy cập, vai trò, và tương tác của họ trong hệ thống. User Identity đóng vai trò quan trọng trong việc đảm bảo bảo mật, cá nhân hóa trải nghiệm, và truy xuất trách nhiệm trong phần mềm hoặc dịch vụ trực tuyến.

Tầm quan trọng của danh tính người dùng
  1. Access Control (Kiểm soát truy cập):
    • Danh tính người dùng là yếu tố cốt lõi trong việc kiểm soát truy cập đến các cơ chế và chức năng trong hệ thống.
    • Nó hỗ trợ thực thi các chính sách xác thực và ủy quyền, từ đó xác định người dùng có quyền truy cập vào tài nguyên nào.
  2. Security (Bảo mật):
    • Quản lý danh tính hiệu quả là nền tảng để đảm bảo bảo mật dữ liệu nhạy cảm.
    • Xác định chính xác người dùng giúp tổ chức giảm thiểu nguy cơ truy cập trái phép và vi phạm bảo mật.
  3. Personalization (Cá nhân hóa):
    • Danh tính người dùng cho phép tùy biến trải nghiệm, ví dụ như đề xuất nội dung, dịch vụ, hoặc cài đặt theo sở thích cá nhân.
  4. Auditing and Accountability (Theo dõi và Truy vết):
    • Danh tính giúp ghi lại hành vi người dùng để phục vụ mục tiêu kiểm toán, tuân thủ quy định và bảo mật.
    • Dễ dàng xác định và truy vết hành vi độc hại đến người chịu trách nhiệm.
  5. Single Sign-On (SSO) và Federated Identity (Danh tính liên kết):
    • Cho phép người dùng đăng nhập một lần để truy cập nhiều dịch vụ khác nhau.
    • Hỗ trợ đăng nhập bằng thông tin từ nhà cung cấp danh tính bên ngoài (ví dụ: Google, Facebook).

Các loại danh tính người dùng

  • Local User Identity: Danh tính được lưu và quản lý trong chính ứng dụng.
  • External Identity Providers: Các nhà cung cấp danh tính bên ngoài như Google, Facebook, LDAP.
  • Service Accounts: Tài khoản hệ thống, script, hoặc API sử dụng cho mục đích máy-máy.
  • Anonymous Identities: Danh tính ẩn danh hoặc tạm thời (khách vãng lai).
  • Role-Based Identities: Danh tính dựa trên vai trò (admin, user…) kèm theo các quyền cụ thể.

14.2 Tìm hiểu về Đăng nhập Người dùng

Xác thực (Authentication) là quy trình xác minh danh tính người dùng khi họ truy cập hệ thống.

14.2.1 Quy trình Xác thực

  1. Yêu cầu người dùng: Người dùng gửi yêu cầu truy cập tài nguyên.
  2. Middleware xác thực: Request được xử lý bởi lớp middleware của ASP.NET Core.
  3. Xác minh danh tính: Middleware xác minh danh tính thông qua thông tin như token hoặc thông tin đăng nhập.
  4. Kết quả xác thực: Nếu thành công, hệ thống tạo ra một đối tượng xác thực (ClaimsPrincipal).
  5. Ủy quyền truy cập: Middleware tiếp tục đánh giá quyền của người dùng để truy cập tài nguyên.

14.2.2 Tầm quan trọng của cơ chế đăng nhập an toàn

  1. Ngăn chặn truy cập trái phép: Chỉ người dùng hợp lệ mới được truy cập tài nguyên nhạy cảm.
  2. Bảo vệ thông tin nhạy cảm: Sử dụng các kỹ thuật như mã hóa, hashing để bảo vệ thông tin đăng nhập.
  3. Chống lại các tấn công vào thông tin xác thực: Sử dụng MFA, CAPTCHA, giới hạn đăng nhập sai, v.v.
  4. Tăng độ tin cậy: Hệ thống xác thực an toàn giúp tăng niềm tin của người dùng.

14.3 Bảo mật mật khẩu

Password Hashing (Băm mật khẩu):

  • Biến mật khẩu thuần thành dạng mã hóa không thể đảo ngược bằng thuật toán băm.
  • Một số thuật toán phổ biến: SHA-256, bcrypt, Argon2.

Salted Hashing:

  • Salt là chuỗi ngẫu nhiên được thêm vào mật khẩu trước khi băm để tăng tính bảo mật.
  • Tránh việc tấn công bằng bảng băm sẵn (rainbow tables).

Ví dụ: Nếu hai người dùng có cùng mật khẩu, nhưng mỗi người có một salt riêng → kết quả băm sẽ khác nhau.


Password Policies và Quy tắc Độ phức tạp

  • Yêu cầu độ dài tối thiểu.
  • Bắt buộc dùng ký tự hoa, thường, số, ký tự đặc biệt.
  • Chính sách thay đổi mật khẩu định kỳ.
  • Giảm thiểu khả năng bị rò rỉ hoặc đoán mật khẩu.

14.4 Session State trong ASP.NET Core

Session State giúp lưu giữ thông tin người dùng trong suốt phiên làm việc.

Vai trò chính của Session:

  • User Personalization: Ghi nhớ cài đặt cá nhân như giỏ hàng, ngôn ngữ, v.v.
  • Data Persistence: Duy trì trạng thái giữa các yêu cầu HTTP khác nhau.
  • Authentication and Authorization: Lưu trạng thái đăng nhập và quyền truy cập của người dùng.
  • Stateful Interaction: Cho phép ứng dụng phản hồi linh hoạt dựa trên thông tin phiên hiện tại.

Dưới đây là bản dịch chi tiết và đầy đủ cho ba ảnh bạn vừa gửi (trang 304–306):


14.4.1 Triển khai Session State trong ASP.NET Core

ASP.NET Core cung cấp các thành phần middleware để quản lý session state trong quá trình xử lý request. Để bật session state, bạn cần cấu hình và sử dụng middleware phù hợp để lưu trữ dữ liệu session. Bạn cũng có thể chọn cơ chế lưu trữ cho dữ liệu session.

Ví dụ về cách bật middleware session state trong file Program.cs được trình bày trong Code Snippet 1.

Code Snippet 1

using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;

class Program {
    public static void Main(string[] args) =>
        CreateHostBuilder(args).Build().Run();

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder => {
                webBuilder.ConfigureServices(services => {
                    services.AddControllersWithViews();
                    // Cấu hình session
                    services.AddSession(options => {
                        options.Cookie.HttpOnly = true;
                        options.Cookie.IsEssential = true;
                        options.IdleTimeout = 
                            TimeSpan.FromMinutes(30); // Điều chỉnh thời gian timeout tùy ý
                    });
                })
                .Configure(app => {
                    app.UseHttpsRedirection();
                    app.UseStaticFiles();
                    app.UseRouting();
                    // Sử dụng middleware session
                    app.UseSession();
                    app.UseEndpoints(endpoints => {
                        endpoints.MapControllerRoute(
                            name: "default",
                            pattern: "{controller=Home}/{action=Index}/{id?}"
                        );
                    });
                });
            });
}

Trong phần triển khai này:

  • AddSession được dùng để cấu hình các tùy chọn session như thuộc tính cookie và thời gian timeout.
  • Middleware UseSession được thêm vào pipeline xử lý request để bật trạng thái session.
  • Bạn có thể điều chỉnh các tùy chọn session như thời gian timeout theo nhu cầu ứng dụng.

Phân tích chi tiết đoạn triển khai:

1. Phương thức AddSession:

  • services.AddSession(options => { ... }) được dùng để cấu hình các tùy chọn session.
  • Trong biểu thức lambda, bạn có thể chỉ định các cài đặt khác nhau cho session, ví dụ:
    • options.Cookie.HttpOnly = true; → Đặt thuộc tính HttpOnly cho cookie của session, ngăn chặn truy cập qua JavaScript phía client.
    • options.Cookie.IsEssential = true; → Đánh dấu cookie này là “thiết yếu”, nghĩa là middleware session vẫn sẽ hoạt động ngay cả khi người dùng không đồng ý cookie không thiết yếu.

2. Middleware UseSession:

  • app.UseSession() được thêm vào pipeline trong phương thức Configure.
  • Middleware này kích hoạt trạng thái session cho ứng dụng.
  • Nó nên được đặt sau các middleware khác như UseRouting, UseStaticFiles, nhưng trước UseEndpoints.
  • Điều này đảm bảo rằng trạng thái session có sẵn để xử lý các request trong controller và view.

3. Tùy chỉnh các tùy chọn session:

  • Đoạn mã cung cấp cơ chế để điều chỉnh các tùy chọn session theo yêu cầu của ứng dụng.
  • Ví dụ, bạn có thể thay đổi thời gian hết hạn bằng cách sửa options.IdleTimeout để giữ session hoạt động trong thời gian dài hơn khi không có hoạt động.
  • Bạn cũng có thể cấu hình các thuộc tính khác của cookie session như: domain, path, secure, và SameSite.

14.5 Quản lý User Identity và Bảo mật với Ứng dụng Mẫu

Hãy cùng triển khai một ứng dụng từng bước để cấu hình tính năng quản lý danh tính người dùng và bảo mật trong ứng dụng ASP.NET Core Web bằng một ví dụ đầy đủ. Ví dụ này sẽ bao gồm: đăng ký người dùng, đăng nhập và xác thực người dùng.

Bước 1: Tạo một dự án ASP.NET Core mới

Tạo một dự án ASP.NET Core Model View Controller như minh họa trong Hình 14.1:

📌 Figure 14.1: ASP.NET Core Project Setup

  • Project Type: ASP.NET Core Web App (Model-View-Controller)
  • Authentication Type: Individual Accounts
  • Enable Razor runtime compilation (tùy chọn)

Dưới đây là bản dịch đầy đủ, chi tiết cho 5 trang bạn vừa gửi (trang 307–311), bao gồm cả đoạn mã:


Bước 2: Thiết lập ASP.NET Core Identity

Trước tiên, ta cần thiết lập ASP.NET Core Identity để xử lý việc xác thực và phân quyền người dùng.

Cài đặt các gói cần thiết bằng NuGet Package Manager trong Visual Studio 2022:

Microsoft.AspNetCore.Identity.EntityFrameworkCore
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools

Bước 3: Thiết lập Controller Classes

Tạo lớp AccountController trong thư mục Controllers như minh họa trong Code Snippet 2.

Lớp này xử lý các hành động xác thực người dùng như đăng nhập, đăng ký và đăng xuất trong ứng dụng ASP.NET Core MVC. Nó sử dụng tính năng SignInManager và UserManager của ASP.NET Core Identity để thực hiện đăng nhập người dùng, tạo tài khoản, và các tính năng như băm mật khẩu, tạo tài khoản và quản lý session.

Code Snippet 2:

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using UserIdentity7.ViewModels;
using UserIdentity7.Models;

namespace UserIdentity7.Controllers
{
    public class AccountController : Controller
    {
        private SignInManager<AppUser> signInManager;
        private UserManager<AppUser> userManager;

        public AccountController(SignInManager<AppUser> signInMgr,
                                 UserManager<AppUser> userMgr)
        {
            signInManager = signInMgr;
            userManager = userMgr;
        }

        public IActionResult Login(string returnUrl = null)
        {
            ViewData["ReturnUrl"] = returnUrl;
            return View();
        }

        [HttpPost]
        public async Task<IActionResult> Login(LoginVM model, string returnUrl = null)
        {
            ViewData["ReturnUrl"] = returnUrl;

            if (ModelState.IsValid)
            {
                var result = await signInManager.PasswordSignInAsync(
                    model.Username, model.Password, model.RememberMe, false);

                if (result.Succeeded)
                    return RedirectToLocal(returnUrl);

                ModelState.AddModelError("", "Invalid login attempt.");
            }

            return View(model);
        }

        public IActionResult Register(string returnUrl = null)
        {
            ViewData["ReturnUrl"] = returnUrl;
            return View();
        }

        [HttpPost]
        public async Task<IActionResult> Register(RegisterVM model, string returnUrl = null)
        {
            ViewData["ReturnUrl"] = returnUrl;

            if (ModelState.IsValid)
            {
                AppUser user = new AppUser
                {
                    Name = model.Name,
                    UserName = model.Email,
                    Email = model.Email,
                    Address = model.Address
                };

                var result = await userManager.CreateAsync(user, model.Password);

                if (result.Succeeded)
                {
                    await signInManager.SignInAsync(user, false);
                    return RedirectToLocal(returnUrl);
                }

                foreach (var error in result.Errors)
                    ModelState.AddModelError("", error.Description);
            }

            return View(model);
        }

        public async Task<IActionResult> Logout()
        {
            await signInManager.SignOutAsync();
            return RedirectToAction("Index", "Home");
        }

        private IActionResult RedirectToLocal(string returnUrl)
        {
            if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
                return Redirect(returnUrl);
            else
                return RedirectToAction(nameof(HomeController.Index), nameof(HomeController));
        }
    }
}

Bước 4: Thiết lập DbContext

Tạo lớp AppDbContext để đại diện cho ngữ cảnh cơ sở dữ liệu của ứng dụng. Lớp này kế thừa từ IdentityDbContext<IdentityUser> như trong Code Snippet 4.

Code Snippet 4:

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;

namespace UserIdentity7.Data
{
    public class AppDbContext : IdentityDbContext<IdentityUser>
    {
        public AppDbContext(DbContextOptions<AppDbContext> options)
            : base(options) { }
    }
}

Bước 5: Định nghĩa lớp ApplicationUser

Tạo lớp AppUser để đại diện cho người dùng của ứng dụng. Lớp này kế thừa từ IdentityUser.

Code Snippet 5:

using Microsoft.AspNetCore.Identity;
using System.ComponentModel.DataAnnotations;

namespace UserIdentity7.Models
{
    public class AppUser : IdentityUser
    {
        [StringLength(100)]
        [MaxLength(100)]
        [Required]
        public string Name { get; set; }

        public string Address { get; set; }
    }
}

Lớp AppUser mở rộng IdentityUser bằng cách thêm các thuộc tính như Name và Address, cho phép lưu trữ thêm thông tin người dùng ngoài những gì mà IdentityUser cung cấp mặc định.


Bước 6: Định nghĩa Login View Model và Register Model Class

Tạo một lớp tên LoginVM trong thư mục ViewModels. Thêm mã trong Code Snippet 6:

using System.ComponentModel.DataAnnotations;

namespace UserIdentity7.ViewModels
{
    public class LoginVM
    {
        [Required(ErrorMessage = "Username is required.")]
        public string? Username { get; set; }

        [Required(ErrorMessage = "Password is required.")]
        [DataType(DataType.Password)]
        public string? Password { get; set; }

        [Display(Name = "Remember Me")]
        public bool RememberMe { get; set; }
    }
}

Lớp LoginVM dùng để xử lý dữ liệu đăng nhập của người dùng. Nó bao gồm các thuộc tính cho Username, Password, và RememberMe, mỗi thuộc tính đều có chú thích xác thực như [Required] và [Display] để hiển thị nhãn và xác thực dữ liệu đầu vào.


Tiếp theo, tạo lớp RegisterVM trong thư mục ViewModels. Thêm đoạn mã trong Code Snippet 7:

using System.ComponentModel.DataAnnotations;

namespace UserIdentity7.ViewModels
{
    public class RegisterVM
    {
        [Required]
        public string? Name { get; set; }

        [Required]
        [EmailAddress]
        public string? Email { get; set; }

        [Required]
        [DataType(DataType.Password)]
        public string? Password { get; set; }

        [Compare("Password", ErrorMessage = "Passwords don't match.")]
        [Display(Name = "Confirm Password")]
        [DataType(DataType.Password)]
        public string? ConfirmPassword { get; set; }

        [DataType(DataType.MultilineText)]
        public string? Address { get; set; }
    }
}

Lớp RegisterVM được sử dụng trong form đăng ký người dùng. Nó có các thuộc tính như Name, Email, Password, ConfirmPassword, Address, mỗi thuộc tính đều có các annotation xác thực để kiểm tra dữ liệu hợp lệ khi nhập vào biểu mẫu.


Bước 7: Tạo các file cshtml cho Login và Register

Tạo một Razor view mới tên Login.cshtml trong thư mục Views/Account. File này sẽ chứa form đăng nhập người dùng như trong Code Snippet 8:

(Chi tiết HTML trong đoạn mã được giữ nguyên để tránh mất định dạng)

Mô tả:

  • File Login.cshtml chịu trách nhiệm hiển thị form đăng nhập.
  • Nó sử dụng model LoginVM để liên kết dữ liệu nhập.
  • Gồm các trường nhập Username, Password, RememberMe.
  • Sử dụng asp-action để xác định phương thức xử lý khi người dùng submit form.

Tiếp theo, tạo một Razor view mới tên Register.cshtml trong Views/Account. File này sẽ chứa form đăng ký người dùng như trong Code Snippet 9:

@using UserIdentity7.ViewModels;
@model RegisterVM

@{
    ViewData["Title"] = "Register";
}

<div class="row d-flex align-items-center justify-content-center">
    <div class="col-md-4 card p-3">
        <h2 class="text-center text-info">Register</h2>
        <form asp-action="Register" method="post" asp-route-returnurl="@ViewData["ReturnUrl"]">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>

            <div class="mb-1">
                <label asp-for="Name" class="control-label"></label>
                <input asp-for="Name" class="form-control" />
                <span asp-validation-for="Name" class="text-danger"></span>
            </div>

            <div class="mb-1">
                <label asp-for="Email" class="control-label"></label>
                <input asp-for="Email" class="form-control" />
                <span asp-validation-for="Email" class="text-danger"></span>
            </div>

            <div class="mb-1">
                <label asp-for="Password" class="control-label"></label>
                <input asp-for="Password" class="form-control" />
                <span asp-validation-for="Password" class="text-danger"></span>
            </div>

            <div class="mb-1">
                <label asp-for="ConfirmPassword" class="control-label"></label>
                <input asp-for="ConfirmPassword" class="form-control" />
                <span asp-validation-for="ConfirmPassword" class="text-danger"></span>
            </div>

            <div class="mb-1">
                <label asp-for="Address" class="control-label"></label>
                <textarea asp-for="Address" class="form-control" rows="2"></textarea>
                <span asp-validation-for="Address" class="text-danger"></span>
            </div>

            <div class="row">
                <div class="col-8">
                    <a asp-action="Login" asp-route-returnurl="@ViewData["ReturnUrl"]" class="text-decoration-none float-start mt-1">Have account?</a>
                </div>
                <div class="col-4">
                    <input type="submit" value="Register" class="btn btn-primary btn-sm float-end" />
                </div>
            </div>
        </form>
    </div>
</div>

@section Scripts {
    @await Html.RenderPartialAsync("_ValidationScriptsPartial")
}

Mô tả:

  • Register.cshtml chứa form đăng ký người dùng cho ASP.NET Core MVC.
  • Sử dụng model RegisterVM để binding và xác thực dữ liệu nhập như Name, Email, Password, ConfirmPassword, Address.
  • Sử dụng asp-validation-for để hiển thị lỗi xác thực.
  • Dùng asp-action="Register" để gửi form tới phương thức Register.

Tạo Partial View cho Login/Logout

Tạo một file Razor view mới tên là LoginPartial.cshtml trong thư mục Views/Shared. File này hiển thị các tuỳ chọn liên quan đến đăng nhập tuỳ thuộc vào trạng thái đăng nhập của người dùng (signed in hoặc không).

@using UserIdentity7.Controllers;
@using UserIdentity7.Models;
@using Microsoft.AspNetCore.Identity;
@inject SignInManager<AppUser> signInManager

<ul class="navbar-nav">
    @if (signInManager.IsSignedIn(User))
    {
        <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
                @User.Identity!.Name
            </a>
            <ul class="dropdown-menu" aria-labelledby="navbarDropdown">
                <li><a class="dropdown-item" asp-action="Logout" asp-controller="Account">Logout</a></li>
            </ul>
        </li>
    }
    else
    {
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="" asp-controller="Account" asp-action="Register">Register</a>
        </li>
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="" asp-controller="Account" asp-action="Login">Login</a>
        </li>
    }
</ul>

🔧 Chèn vào Layout: Trong file _Layout.cshtml (nằm trong Views/Shared), thêm dòng sau để nhúng view partial trên:

<partial name="LoginPartial" />

Dưới đây là bản dịch chi tiết Code Snippet 11 và phần mô tả về tập tin appsettings.json từ ảnh bạn đã gửi:


✅ Bước 8: Cấu hình các dịch vụ trong tệp Program.cs

Code Snippet 11 (Tệp Program.cs):

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using UserIdentity7.Data;
using UserIdentity7.Models;

var builder = WebApplication.CreateBuilder(args);

// Thiết lập chuỗi kết nối
var connectionString = builder.Configuration.GetConnectionString("default1");

// Thêm các dịch vụ vào container.
builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer(connectionString));

// Thêm dịch vụ Identity và cấu hình mật khẩu
builder.Services.AddIdentity<AppUser, IdentityRole>(options =>
{
    options.Password.RequireDigit = true;
    options.Password.RequireUppercase = false;
    options.Password.RequireNonAlphanumeric = false;
    options.Password.RequiredLength = 5;
    options.Password.RequireLowercase = false;
})
.AddEntityFrameworkStores<AppDbContext>()
.AddDefaultTokenProviders();

var app = builder.Build();

// Cấu hình pipeline xử lý HTTP request
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error"); // xử lý lỗi trong production
    app.UseHsts(); // sử dụng HTTP Strict Transport Security
}

app.UseHttpsRedirection();     // chuyển hướng sang HTTPS
app.UseStaticFiles();          // phục vụ các tệp tĩnh

app.UseRouting();              // kích hoạt routing

app.UseAuthentication();       // bật middleware xác thực
app.UseAuthorization();        // bật middleware phân quyền

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}"); // định nghĩa route mặc định

app.Run();

Giải thích chi tiết:

  • builder.Configuration.GetConnectionString("default1"): Lấy chuỗi kết nối SQL Server từ tệp appsettings.json.
  • AddDbContext<AppDbContext>: Đăng ký lớp ngữ cảnh cơ sở dữ liệu (AppDbContext) để sử dụng Entity Framework.
  • AddIdentity<AppUser, IdentityRole>: Đăng ký hệ thống xác thực người dùng bằng Identity.
  • .AddEntityFrameworkStores<AppDbContext>(): Liên kết Identity với Entity Framework thông qua DbContext.
  • .AddDefaultTokenProviders(): Cho phép sử dụng các token mặc định (ví dụ: xác nhận email, khôi phục mật khẩu).
  • Cấu hình Password quy định các yêu cầu về độ mạnh mật khẩu.
  • UseAuthentication() và UseAuthorization(): Kích hoạt các middleware để xác thực và phân quyền.

✅ Tệp cấu hình: appsettings.json (Hình 14.3)

Nội dung mẫu trong ảnh:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "ConnectionStrings": {
    "default1": "Server=.;Database=UserIdentity7;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "AllowedHosts": "*"
}

Giải thích chi tiết:

  • "Logging": Cấu hình mức độ ghi log cho toàn bộ ứng dụng:
    • "Default": "Information": Ghi thông tin cấp độ thông báo chung.
    • "Microsoft.AspNetCore": "Warning": Chỉ ghi log mức cảnh báo từ các namespace liên quan đến ASP.NET Core.
  • "ConnectionStrings": Khai báo chuỗi kết nối đến cơ sở dữ liệu SQL Server:
    • "default1": Tên kết nối (dùng trong Program.cs).
    • "Server=.": Kết nối đến SQL Server cục bộ.
    • "Database=UserIdentity7": Tên cơ sở dữ liệu.
    • "Trusted_Connection=True": Dùng xác thực Windows.
    • "MultipleActiveResultSets=true": Cho phép nhiều tập kết quả đang mở đồng thời (hữu ích khi dùng EF).
  • "AllowedHosts": "*": Cho phép tất cả host truy cập vào ứng dụng (dùng khi triển khai).

Dưới đây là bản dịch chi tiết không sót ý nào của các trang bạn vừa gửi:


Hình 14.4: Solution Explorer của Dự án

Cấu trúc dự án cuối cùng trong Solution Explorer được thể hiện trong Hình 14.4.


Hình 14.5: Lệnh Migration

Hãy chắc chắn thực hiện migration bằng cách sử dụng lệnh sau trong Package Manager Console của dự án như thể hiện trong Hình 14.5:

add-migration Initial

Lệnh add-migration Initial được sử dụng trong Entity Framework Core để scaffold một migration mới có tên là Initial. Lệnh này tạo ra mã để tạo sơ đồ cơ sở dữ liệu mới dựa trên các thay đổi đã thực hiện trong DbContext. Nó sẽ phân tích trạng thái hiện tại của DbContext và tạo ra một tệp migration chứa các thao tác cần thiết để cập nhật sơ đồ cơ sở dữ liệu nhằm đồng bộ với trạng thái mô hình hiện tại. Lệnh này giúp quản lý các thay đổi của sơ đồ cơ sở dữ liệu và giữ cho cơ sở dữ liệu luôn đồng bộ với mô hình dữ liệu của ứng dụng.


Hình 14.6: Giao diện Đăng Nhập (Login View)

Cuối cùng, chạy lệnh:

update-database

trong Package Manager Console. Lệnh này sẽ tự động tạo các bảng cần thiết liên quan đến User Identity trong ASP.NET.

Sau đó, tiến hành Build và Run ứng dụng.

Kết quả hiển thị cuối cùng trong trình duyệt được thể hiện ở Hình 14.6 và 14.7.

Ứng dụng sẽ mở ra với trang đăng nhập. Tuy nhiên, nếu đây là lần đầu truy cập, bạn cần phải đăng ký tài khoản. Nhấp vào liên kết Register ở góc trên cùng của cửa sổ trình duyệt. Giao diện đăng ký được hiển thị trong Hình 14.7.


Hình 14.7: Giao diện Đăng Ký (Register View)


Lưu ý (Note):
Nếu bạn gặp lỗi sau:

InvalidOperationException: The view 'Register' was not found

điều đó có nghĩa là view Register chưa được tìm thấy trong dự án.

Giải pháp:

  • Trong Solution Explorer, nhấn chuột phải vào project solution, chọn Manage NuGet Packages, và thêm gói: Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  • Sau đó thêm dòng sau vào file Program.cs:
builder.Services.AddControllersWithViews().AddRazorRuntimeCompilation();

Chạy lại ứng dụng, lỗi sẽ được khắc phục.

Bài viết liên quan:

Triển khai Repository Pattern và Unit of Work trong ASP.NET Core
Xác thực thông qua Token trong ứng dụng Web sử dụng .NET Core
Tổng quan về Fluent Model và AutoMapper trong ASP.NET Core MVC
Kiến trúc Onion trong ASP.NET Core – Phần II
Kiến trúc Onion trong ASP.NET Core
Kiến trúc .NET Core và Triển khai Kestrel Web Server
Một số cải tiến trong ASP.NET Core, Razor Page, Model Binding, Gabbage collection
Các Phương thức hành động (Action Methods) và khái niệm nâng cao trong C# MVC
Giới thiệu chi tiết kiến trúc ASP.NET MVC và Core MVC
Phát triển Client Side sử dụng ASP.NET Core MVC
Khởi tạo dự án Hello World với ADO.NET và Entity Framework
Làm việc với Web Forms, Controls và Events trong ASP.NET

THÊM BÌNH LUẬN Cancel reply

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

Đăng nhập và xác thực người dùng với ASP.NET Core Identity

Triển khai Repository Pattern và Unit of Work trong ASP.NET Core

GUI/Desktop Apps với C#

Xác thực thông qua Token trong ứng dụng Web sử dụng .NET Core

Tổng quan về Fluent Model và AutoMapper trong ASP.NET Core MVC

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×