Hướng dẫn làm đăng nhập dùng html trong asp.net

Identity trong ASP.NET Core được dùng để quản lý tài khoản người dùng trong ứng dụng. Nó cung cấp các tính năng cần thiết để quản lý tài khoản user (tạo, xóa, sửa), vai trò (role, phân quyền), claim, đăng ký, đăng nhập, reset password ...

"ConnectionStrings": {

"AppDbContext": "Data Source=localhost,1433; Initial Catalog=albumdb; User ID=SA;Password=Password123"  
} 7 là thông tin về User. Nó diễn tả các thuộc tính của User nhằm sử dụng trong quá trình xác minh, xác thực (authentication, authorization). Claim lưu thông tin dạng cặp key - value, thông thường là thông tin về ID, email, username

Authentication và Authorization (Xác thực và quyền hạn): Xác thực (Authentication) là quá trình trong đó user cung cấp thông tin xác thực (user, password ...) đã được lưu trong hệ thống ứng dụng (database). Nếu thông tin cung cấp chính xác thì user xác thực (authentication) thành công. Sau đó user mới có thể thi hành các tác vụ được cho phép. Quá trình xác định xem người dùng được pháp làm gì (thực hiện tác vụ gì) đó là Authorization - quyền hạn.

Thư viện .NET Identity cung cấp sẵn code để làm việc với Identity từ trang đăng ký, đăng nhập, quản lý User ... Tất cả các file code này có thể phát sinh đưa vào dự án bằng sử dụng lệnh

"ConnectionStrings": {

"AppDbContext": "Data Source=localhost,1433; Initial Catalog=albumdb; User ID=SA;Password=Password123"  
} 8

Sau đây sẽ tạo một dự án ví dụ có sử dụng Identity để xác thực, phân quyền ... có sử dụng EF truy vấn thông tin lưu ở MS SQL Server

Tạo ứng dụng Razor Pages, ứng dụng quản lý các Album nhạc, vậy tạo thư mục

"ConnectionStrings": {

"AppDbContext": "Data Source=localhost,1433; Initial Catalog=albumdb; User ID=SA;Password=Password123"  
} 9, vào thư mục đó thi hành lệnh:

dotnet new webapp

Thêm các gói để làm việc với Identity, EF, MS SQL Server, phát sinh code ...

dotnet add package System.Data.SqlClient dotnet add package Microsoft.EntityFrameworkCore dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.Extensions.DependencyInjection dotnet add package Microsoft.Extensions.Logging.Console dotnet add package Microsoft.AspNetCore.Identity dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.AspNetCore.Identity.UI dotnet add package Microsoft.AspNetCore.Authentication dotnet add package Microsoft.AspNetCore.Http.Abstractions dotnet add package Microsoft.AspNetCore.Authentication.Cookies dotnet add package Microsoft.AspNetCore.Authentication.Facebook dotnet add package Microsoft.AspNetCore.Authentication.Google dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package Microsoft.AspNetCore.Authentication.MicrosoftAccount dotnet add package Microsoft.AspNetCore.Authentication.oAuth dotnet add package Microsoft.AspNetCore.Authentication.OpenIDConnect dotnet add package Microsoft.AspNetCore.Authentication.Twitter Cũng cài đặt công cụ về EF nếu chưa cài đặt:

dotnet tool install --global dotnet-ef

Chuẩn bị máy chủ Cơ sở dữ liệu SQL SERVER: bạn cần có một máy chủ cơ sở dữ liệu (giả sử MS SQL Server), nếu chưa hãy tạo máy chủ này theo hướng dẫn

Khi đã có máy chủ, cần thêm chuỗi kết nối vào cấu hình ứng dụng ở file appsettings.json (xem ), giả sử database đặt tên là

public class IdentityUser {

public IdentityUser(string userName);  
public virtual bool TwoFactorEnabled { get; set; }  
public virtual bool PhoneNumberConfirmed { get; set; }  
public virtual string PhoneNumber { get; set; }  
public virtual string SecurityStamp { get; set; }  
public virtual bool EmailConfirmed { get; set; }  
public virtual string Email { get; set; }  
public virtual string UserName { get; set; }  
public virtual string Id { get; set; }  
public virtual bool LockoutEnabled { get; set; }  
public virtual int AccessFailedCount { get; set; }  
} 0, thì chuỗi kết nối cần thêm vào cấu hình có thể là

"ConnectionStrings": {

"AppDbContext": "Data Source=localhost,1433; Initial Catalog=albumdb; User ID=SA;Password=Password123"  
} Chuỗi kết nối này sẽ được DbContext mà chúng ta sẽ tạo ra sau đây sủ dụng kết nối đến database.

Tạo Model Identity

ASP.NET cung cấp sẵn một lớp Model chứa các thông tin về User, đó là lớp

public class IdentityUser {

public IdentityUser(string userName);  
public virtual bool TwoFactorEnabled { get; set; }  
public virtual bool PhoneNumberConfirmed { get; set; }  
public virtual string PhoneNumber { get; set; }  
public virtual string SecurityStamp { get; set; }  
public virtual bool EmailConfirmed { get; set; }  
public virtual string Email { get; set; }  
public virtual string UserName { get; set; }  
public virtual string Id { get; set; }  
public virtual bool LockoutEnabled { get; set; }  
public virtual int AccessFailedCount { get; set; }  
} 1 nó kế thừa từ lớp generic

public class IdentityUser {

public IdentityUser(string userName);  
public virtual bool TwoFactorEnabled { get; set; }  
public virtual bool PhoneNumberConfirmed { get; set; }  
public virtual string PhoneNumber { get; set; }  
public virtual string SecurityStamp { get; set; }  
public virtual bool EmailConfirmed { get; set; }  
public virtual string Email { get; set; }  
public virtual string UserName { get; set; }  
public virtual string Id { get; set; }  
public virtual bool LockoutEnabled { get; set; }  
public virtual int AccessFailedCount { get; set; }  
} 2 với kiểu xác định

public class IdentityUser {

public IdentityUser(string userName);  
public virtual bool TwoFactorEnabled { get; set; }  
public virtual bool PhoneNumberConfirmed { get; set; }  
public virtual string PhoneNumber { get; set; }  
public virtual string SecurityStamp { get; set; }  
public virtual bool EmailConfirmed { get; set; }  
public virtual string Email { get; set; }  
public virtual string UserName { get; set; }  
public virtual string Id { get; set; }  
public virtual bool LockoutEnabled { get; set; }  
public virtual int AccessFailedCount { get; set; }  
} 3. Lớp IdentityUser đã định nghĩa sẵn các thuộc tính, khai báo có dạng tượng tự như sau:

public class IdentityUser {

public IdentityUser(string userName);  
public virtual bool TwoFactorEnabled { get; set; }  
public virtual bool PhoneNumberConfirmed { get; set; }  
public virtual string PhoneNumber { get; set; }  
public virtual string SecurityStamp { get; set; }  
public virtual bool EmailConfirmed { get; set; }  
public virtual string Email { get; set; }  
public virtual string UserName { get; set; }  
public virtual string Id { get; set; }  
public virtual bool LockoutEnabled { get; set; }  
public virtual int AccessFailedCount { get; set; }  
} Ta có thể dùng luôn IdentityUser, tuy nhiên để bổ sung các thuộc tinh ta sẽ khai báo lớp Model kế thừa từ IdentityUser chứ không dùng trực tiếp, tạo lớp

public class IdentityUser {

public IdentityUser(string userName);  
public virtual bool TwoFactorEnabled { get; set; }  
public virtual bool PhoneNumberConfirmed { get; set; }  
public virtual string PhoneNumber { get; set; }  
public virtual string SecurityStamp { get; set; }  
public virtual bool EmailConfirmed { get; set; }  
public virtual string Email { get; set; }  
public virtual string UserName { get; set; }  
public virtual string Id { get; set; }  
public virtual bool LockoutEnabled { get; set; }  
public virtual int AccessFailedCount { get; set; }  
} 4 như sau:

Models/AppUser.cs

using Microsoft.AspNetCore.Identity; namespace Album.Models {

public class AppUser : IdentityUser  
{   
    // Khai báo thêm các thuộc tính ngoài các thuộc  
    // tính như UserName, Email ... cung cấp sẵn bởi IdentityUser  
}  
} Ngoài lớp IdentityUser, có những lớp sau cũng được sử dụng: IdentityRole, IdentityUserRole , IdentityUserClaim , IdentityUserLogin , IdentityUserToken , IdentityRoleClaim , những lớp này sẽ có trong DbContext của ứng dụng.

Tạo DbContext từ IdentityDbContext

DbContext biểu diễn CSDL (cần nắm vững về DbContext trước tại ), trong đó lớp IdentityDbContext là DbContext định nghĩa sẵn trong nó có sẵn các DbSet như:

  • UserRoles
  • Roles
  • RoleClaims
  • Users
  • UserClaims
  • UserLogins
  • UserTokens

Đây chính là các bảng của CSDL chứa thông tin về Identity, để tạo ra DbContext riêng, bạn chỉ việc kế thừa lớp IdentityDbContext. Ta xây dựng DbContext là lớp

public class IdentityUser {

public IdentityUser(string userName);  
public virtual bool TwoFactorEnabled { get; set; }  
public virtual bool PhoneNumberConfirmed { get; set; }  
public virtual string PhoneNumber { get; set; }  
public virtual string SecurityStamp { get; set; }  
public virtual bool EmailConfirmed { get; set; }  
public virtual string Email { get; set; }  
public virtual string UserName { get; set; }  
public virtual string Id { get; set; }  
public virtual bool LockoutEnabled { get; set; }  
public virtual int AccessFailedCount { get; set; }  
} 5

using Album.Models; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace Album.Data {

// Kế thừa từ IdentityDbContext nên có sẵn các DbSet  
// UserRoles Roles RoleClaimsUsers UserClaims UserLogins UserTokens  
public class AppDbContext : IdentityDbContext<AppUser> {
    public AppDbContext (DbContextOptions<AppDbContext> options) : base (options) { }
    protected override void OnModelCreating (ModelBuilder builder) {
        base.OnModelCreating (builder);   
        // Bỏ tiền tố AspNet của các bảng: mặc định các bảng trong IdentityDbContext có  
        // tên với tiền tố AspNet như: AspNetUserRoles, AspNetUser ...  
        // Đoạn mã sau chạy khi khởi tạo DbContext, tạo database sẽ loại bỏ tiền tố đó  
        foreach (var entityType in builder.Model.GetEntityTypes ()) {  
            var tableName = entityType.GetTableName ();  
            if (tableName.StartsWith ("AspNet")) {  
                entityType.SetTableName (tableName.Substring (6));  
            }  
        }  
    }
}  
} Tiếp theo là đăng ký AppDbContext vào dịch vụ hệ thống, xem

Đăng ký AppDbContext vào dịch vụ hệ thống

Cách đăng ký xem tại , mở file Startup.cs, sửa phương thức ConfigureServices

public void ConfigureServices(IServiceCollection services) {

// Đăng ký AppDbContext services.AddDbContext<AppDbContext>(options => { // Đọc chuỗi kết nối string connectstring = Configuration.GetConnectionString("AppDbContext"); // Sử dụng MS SQL Server options.UseSqlServer(connectstring); });

services.AddRazorPages();  
}

Đăng ký các các dịch vụ Identity vào hệ thống

Trong ConfigureServices cho thêm vào, trở thành

public void ConfigureServices(IServiceCollection services) {

// Đăng ký AppDbContext  
services.AddDbContext<AppDbContext>(options => {  
    // Đọc chuỗi kết nối  
    string connectstring = Configuration.GetConnectionString("AppDbContext");  
    // Sử dụng MS SQL Server  
    options.UseSqlServer(connectstring);  
});  
services.AddIdentity<AppUser, IdentityRole>() .AddEntityFrameworkStores<AppDbContext>() .AddDefaultTokenProviders();
services.AddRazorPages();  
} Nếu viết chi tiết ra:

// Thêm vào dịch vụ Identity với cấu hình mặc định cho AppUser (model user) vào IdentityRole (model Role - vai trò) var identityservice = services.AddIdentity<AppUser, IdentityRole>(); // Thêm triển khai EF lưu trữ thông tin về Idetity (theo AppDbContext -> MS SQL Server). identityservice.AddEntityFrameworkStores<<AppDbContext>(); // Thêm Token Provider - nó sử dụng để phát sinh token (reset password, confirm email ...) // đổi email, số điện thoại ... identityservice.AddDefaultTokenProviders();

Thêm Identity vào pipeline, cấu hình Identity

Sửa phương thức Configure trong Startup.cs, thêm vào dòng sau (thêm sau Routing) nếu chưa có:

dotnet add package System.Data.SqlClient dotnet add package Microsoft.EntityFrameworkCore dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.Extensions.DependencyInjection dotnet add package Microsoft.Extensions.Logging.Console dotnet add package Microsoft.AspNetCore.Identity dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.AspNetCore.Identity.UI dotnet add package Microsoft.AspNetCore.Authentication dotnet add package Microsoft.AspNetCore.Http.Abstractions dotnet add package Microsoft.AspNetCore.Authentication.Cookies dotnet add package Microsoft.AspNetCore.Authentication.Facebook dotnet add package Microsoft.AspNetCore.Authentication.Google dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package Microsoft.AspNetCore.Authentication.MicrosoftAccount dotnet add package Microsoft.AspNetCore.Authentication.oAuth dotnet add package Microsoft.AspNetCore.Authentication.OpenIDConnect dotnet add package Microsoft.AspNetCore.Authentication.Twitter 0

Dòng trên thêm vào pipeline middleware AuthorizationMiddleware, cung cấp chức năng xác định quyền. Nó cung cấp chức năng lưu thông tin khi người dùng truy cập, thông tin lưu tại

public class IdentityUser {

public IdentityUser(string userName);  
public virtual bool TwoFactorEnabled { get; set; }  
public virtual bool PhoneNumberConfirmed { get; set; }  
public virtual string PhoneNumber { get; set; }  
public virtual string SecurityStamp { get; set; }  
public virtual bool EmailConfirmed { get; set; }  
public virtual string Email { get; set; }  
public virtual string UserName { get; set; }  
public virtual string Id { get; set; }  
public virtual bool LockoutEnabled { get; set; }  
public virtual int AccessFailedCount { get; set; }  
} 6

Nếu muốn thiết lập thay đổi cấu hình mặc định của Identity thì thay đổi dịch vụ cấu hình của nó như sau, trong

public class IdentityUser {

public IdentityUser(string userName);  
public virtual bool TwoFactorEnabled { get; set; }  
public virtual bool PhoneNumberConfirmed { get; set; }  
public virtual string PhoneNumber { get; set; }  
public virtual string SecurityStamp { get; set; }  
public virtual bool EmailConfirmed { get; set; }  
public virtual string Email { get; set; }  
public virtual string UserName { get; set; }  
public virtual string Id { get; set; }  
public virtual bool LockoutEnabled { get; set; }  
public virtual int AccessFailedCount { get; set; }  
} 7 của lớp

public class IdentityUser {

public IdentityUser(string userName);  
public virtual bool TwoFactorEnabled { get; set; }  
public virtual bool PhoneNumberConfirmed { get; set; }  
public virtual string PhoneNumber { get; set; }  
public virtual string SecurityStamp { get; set; }  
public virtual bool EmailConfirmed { get; set; }  
public virtual string Email { get; set; }  
public virtual string UserName { get; set; }  
public virtual string Id { get; set; }  
public virtual bool LockoutEnabled { get; set; }  
public virtual int AccessFailedCount { get; set; }  
} 8 thêm đoạn mã cấu hình (nhớ thêm phía sau AddIdentity):

dotnet add package System.Data.SqlClient dotnet add package Microsoft.EntityFrameworkCore dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.Extensions.DependencyInjection dotnet add package Microsoft.Extensions.Logging.Console dotnet add package Microsoft.AspNetCore.Identity dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.AspNetCore.Identity.UI dotnet add package Microsoft.AspNetCore.Authentication dotnet add package Microsoft.AspNetCore.Http.Abstractions dotnet add package Microsoft.AspNetCore.Authentication.Cookies dotnet add package Microsoft.AspNetCore.Authentication.Facebook dotnet add package Microsoft.AspNetCore.Authentication.Google dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package Microsoft.AspNetCore.Authentication.MicrosoftAccount dotnet add package Microsoft.AspNetCore.Authentication.oAuth dotnet add package Microsoft.AspNetCore.Authentication.OpenIDConnect dotnet add package Microsoft.AspNetCore.Authentication.Twitter 1

Phát sinh Database có các table về Identity

Khi đã có DbContext là

public class IdentityUser {

public IdentityUser(string userName);  
public virtual bool TwoFactorEnabled { get; set; }  
public virtual bool PhoneNumberConfirmed { get; set; }  
public virtual string PhoneNumber { get; set; }  
public virtual string SecurityStamp { get; set; }  
public virtual bool EmailConfirmed { get; set; }  
public virtual string Email { get; set; }  
public virtual string UserName { get; set; }  
public virtual string Id { get; set; }  
public virtual bool LockoutEnabled { get; set; }  
public virtual int AccessFailedCount { get; set; }  
} 5 bạn có thể sử dụng kỹ thuật migration trong EF để phát sinh, cập nhật DB - xem chi tiết tại Migration trong EntityFramework

Để ý là trong AppDbContext đã dùng kỹ thuật Entity Framework với Fluent API để đổi tên bảng mặc định (loại bỏ tiền tố AspNet)

Chạy lệnh để tạo Migration và tạo db

dotnet add package System.Data.SqlClient dotnet add package Microsoft.EntityFrameworkCore dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.Extensions.DependencyInjection dotnet add package Microsoft.Extensions.Logging.Console dotnet add package Microsoft.AspNetCore.Identity dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.AspNetCore.Identity.UI dotnet add package Microsoft.AspNetCore.Authentication dotnet add package Microsoft.AspNetCore.Http.Abstractions dotnet add package Microsoft.AspNetCore.Authentication.Cookies dotnet add package Microsoft.AspNetCore.Authentication.Facebook dotnet add package Microsoft.AspNetCore.Authentication.Google dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package Microsoft.AspNetCore.Authentication.MicrosoftAccount dotnet add package Microsoft.AspNetCore.Authentication.oAuth dotnet add package Microsoft.AspNetCore.Authentication.OpenIDConnect dotnet add package Microsoft.AspNetCore.Authentication.Twitter 2

dotnet add package System.Data.SqlClient dotnet add package Microsoft.EntityFrameworkCore dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.Extensions.DependencyInjection dotnet add package Microsoft.Extensions.Logging.Console dotnet add package Microsoft.AspNetCore.Identity dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.AspNetCore.Identity.UI dotnet add package Microsoft.AspNetCore.Authentication dotnet add package Microsoft.AspNetCore.Http.Abstractions dotnet add package Microsoft.AspNetCore.Authentication.Cookies dotnet add package Microsoft.AspNetCore.Authentication.Facebook dotnet add package Microsoft.AspNetCore.Authentication.Google dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package Microsoft.AspNetCore.Authentication.MicrosoftAccount dotnet add package Microsoft.AspNetCore.Authentication.oAuth dotnet add package Microsoft.AspNetCore.Authentication.OpenIDConnect dotnet add package Microsoft.AspNetCore.Authentication.Twitter 3

Sau các lệnh này đã có Db, và hệ thống bắt đầu có thể làm việc với các dịch vụ Identity. Cơ sở dữ liệu ban đầu này tạo ra gồm có có bảng và có sơ đồ quan hệ như sau:

Hướng dẫn làm đăng nhập dùng html trong asp.net

Triển khai và đăng ký dịch vụ IEmailSender

Phần sau ta sẽ sử dụng lệnh

"ConnectionStrings": {

"AppDbContext": "Data Source=localhost,1433; Initial Catalog=albumdb; User ID=SA;Password=Password123"  
} 8 để phát sinh ra code dựng sẵn về các trang Razor Page (hoặc các Controller) của Identity từ đó ta chỉ việc tùy biến thay vì phải code từ đầu. Trong chức năng của Identity có nhiều chỗ sử dụng dịch vụ ImailSender để gửi mail, ví dụ khi người dùng đăng ký thì gửi mail kích hoạt, người dùng reset password gửi mail để xác thực ...

Do vậy ta cần triển khai một lớp từ giao diện IEmailSender sau đó đăng ký vào hệ thống để Identity cần thì gọi dịch vụ này và sử dụng, xây dựng lớp đó như sau (áp dụng lại ví dụ tại ):

Thêm vào các gói

dotnet add package System.Data.SqlClient dotnet add package Microsoft.EntityFrameworkCore dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.Extensions.DependencyInjection dotnet add package Microsoft.Extensions.Logging.Console dotnet add package Microsoft.AspNetCore.Identity dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.AspNetCore.Identity.UI dotnet add package Microsoft.AspNetCore.Authentication dotnet add package Microsoft.AspNetCore.Http.Abstractions dotnet add package Microsoft.AspNetCore.Authentication.Cookies dotnet add package Microsoft.AspNetCore.Authentication.Facebook dotnet add package Microsoft.AspNetCore.Authentication.Google dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package Microsoft.AspNetCore.Authentication.MicrosoftAccount dotnet add package Microsoft.AspNetCore.Authentication.oAuth dotnet add package Microsoft.AspNetCore.Authentication.OpenIDConnect dotnet add package Microsoft.AspNetCore.Authentication.Twitter 4

Thêm vào

using Microsoft.AspNetCore.Identity; namespace Album.Models {

public class AppUser : IdentityUser  
{   
    // Khai báo thêm các thuộc tính ngoài các thuộc  
    // tính như UserName, Email ... cung cấp sẵn bởi IdentityUser  
}  
} 1

dotnet add package System.Data.SqlClient dotnet add package Microsoft.EntityFrameworkCore dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.Extensions.DependencyInjection dotnet add package Microsoft.Extensions.Logging.Console dotnet add package Microsoft.AspNetCore.Identity dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.AspNetCore.Identity.UI dotnet add package Microsoft.AspNetCore.Authentication dotnet add package Microsoft.AspNetCore.Http.Abstractions dotnet add package Microsoft.AspNetCore.Authentication.Cookies dotnet add package Microsoft.AspNetCore.Authentication.Facebook dotnet add package Microsoft.AspNetCore.Authentication.Google dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package Microsoft.AspNetCore.Authentication.MicrosoftAccount dotnet add package Microsoft.AspNetCore.Authentication.oAuth dotnet add package Microsoft.AspNetCore.Authentication.OpenIDConnect dotnet add package Microsoft.AspNetCore.Authentication.Twitter 5

Xây dựng các lớp

using Microsoft.AspNetCore.Identity; namespace Album.Models {

public class AppUser : IdentityUser  
{   
    // Khai báo thêm các thuộc tính ngoài các thuộc  
    // tính như UserName, Email ... cung cấp sẵn bởi IdentityUser  
}  
} 2,

using Microsoft.AspNetCore.Identity; namespace Album.Models {

public class AppUser : IdentityUser  
{   
    // Khai báo thêm các thuộc tính ngoài các thuộc  
    // tính như UserName, Email ... cung cấp sẵn bởi IdentityUser  
}  
} 3 như sau:

Mail/SendMailService.cs

dotnet add package System.Data.SqlClient dotnet add package Microsoft.EntityFrameworkCore dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.Extensions.DependencyInjection dotnet add package Microsoft.Extensions.Logging.Console dotnet add package Microsoft.AspNetCore.Identity dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.AspNetCore.Identity.UI dotnet add package Microsoft.AspNetCore.Authentication dotnet add package Microsoft.AspNetCore.Http.Abstractions dotnet add package Microsoft.AspNetCore.Authentication.Cookies dotnet add package Microsoft.AspNetCore.Authentication.Facebook dotnet add package Microsoft.AspNetCore.Authentication.Google dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package Microsoft.AspNetCore.Authentication.MicrosoftAccount dotnet add package Microsoft.AspNetCore.Authentication.oAuth dotnet add package Microsoft.AspNetCore.Authentication.OpenIDConnect dotnet add package Microsoft.AspNetCore.Authentication.Twitter 6

Tiến hành đăng ký dịch vụ SendMailService và hệ thống với tên giao diện IEmailSender, thêm vào ConfigureServices của Startup đoạn code:

dotnet add package System.Data.SqlClient dotnet add package Microsoft.EntityFrameworkCore dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.Extensions.DependencyInjection dotnet add package Microsoft.Extensions.Logging.Console dotnet add package Microsoft.AspNetCore.Identity dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.AspNetCore.Identity.UI dotnet add package Microsoft.AspNetCore.Authentication dotnet add package Microsoft.AspNetCore.Http.Abstractions dotnet add package Microsoft.AspNetCore.Authentication.Cookies dotnet add package Microsoft.AspNetCore.Authentication.Facebook dotnet add package Microsoft.AspNetCore.Authentication.Google dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package Microsoft.AspNetCore.Authentication.MicrosoftAccount dotnet add package Microsoft.AspNetCore.Authentication.oAuth dotnet add package Microsoft.AspNetCore.Authentication.OpenIDConnect dotnet add package Microsoft.AspNetCore.Authentication.Twitter 7

Từ giờ chỗ nào cần sử dụng IEmailSender để gửi mail thì đã có sẵn trong hệ thống.

Phát sinh code (scaffold) Identity

Lệnh

"ConnectionStrings": {

"AppDbContext": "Data Source=localhost,1433; Initial Catalog=albumdb; User ID=SA;Password=Password123"  
} 8 sẽ phát sinh các code (các Model, trang Razor Page, Controller, View) sẵn cho chúng ta, qua đó chỉ việc tùy biến lại, bạn thực hiện lệnh như sau (nhớ cài đặt đầy đủ công cụ và các gói ở trên):

dotnet add package System.Data.SqlClient dotnet add package Microsoft.EntityFrameworkCore dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.Extensions.DependencyInjection dotnet add package Microsoft.Extensions.Logging.Console dotnet add package Microsoft.AspNetCore.Identity dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.AspNetCore.Identity.UI dotnet add package Microsoft.AspNetCore.Authentication dotnet add package Microsoft.AspNetCore.Http.Abstractions dotnet add package Microsoft.AspNetCore.Authentication.Cookies dotnet add package Microsoft.AspNetCore.Authentication.Facebook dotnet add package Microsoft.AspNetCore.Authentication.Google dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package Microsoft.AspNetCore.Authentication.MicrosoftAccount dotnet add package Microsoft.AspNetCore.Authentication.oAuth dotnet add package Microsoft.AspNetCore.Authentication.OpenIDConnect dotnet add package Microsoft.AspNetCore.Authentication.Twitter 8

Tham số

using Microsoft.AspNetCore.Identity; namespace Album.Models {

public class AppUser : IdentityUser  
{   
    // Khai báo thêm các thuộc tính ngoài các thuộc  
    // tính như UserName, Email ... cung cấp sẵn bởi IdentityUser  
}  
} 5 để chỉ ra là Identity sử dụng DbContext là

using Microsoft.AspNetCore.Identity; namespace Album.Models {

public class AppUser : IdentityUser  
{   
    // Khai báo thêm các thuộc tính ngoài các thuộc  
    // tính như UserName, Email ... cung cấp sẵn bởi IdentityUser  
}  
} 6 của chúng ta xây dựng ở trên

Vì ứng dụng khởi tạo ở trên là ASP.NET Razor Pages, nên sau lệnh này nó phát sinh cho dự án sẵn dùng được ngay một loạt trang Razor, mỗi trang tương ứng với các chức năng của Identity như Đăng ký, đăng nhập ... Các trang này được bố trí trong

using Microsoft.AspNetCore.Identity; namespace Album.Models {

public class AppUser : IdentityUser  
{   
    // Khai báo thêm các thuộc tính ngoài các thuộc  
    // tính như UserName, Email ... cung cấp sẵn bởi IdentityUser  
}  
} 7 có tên

using Microsoft.AspNetCore.Identity; namespace Album.Models {

public class AppUser : IdentityUser  
{   
    // Khai báo thêm các thuộc tính ngoài các thuộc  
    // tính như UserName, Email ... cung cấp sẵn bởi IdentityUser  
}  
} 8 - trong thư mục Areas/Identity/Pages

Hướng dẫn làm đăng nhập dùng html trong asp.net

Bạn truy cập Url theo cấu trúc Route của Razor Page (xem ) như url:

using Microsoft.AspNetCore.Identity; namespace Album.Models {

public class AppUser : IdentityUser  
{   
    // Khai báo thêm các thuộc tính ngoài các thuộc  
    // tính như UserName, Email ... cung cấp sẵn bởi IdentityUser  
}  
} 9,

using Album.Models; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace Album.Data {

// Kế thừa từ IdentityDbContext nên có sẵn các DbSet  
// UserRoles Roles RoleClaimsUsers UserClaims UserLogins UserTokens  
public class AppDbContext : IdentityDbContext<AppUser> {
    public AppDbContext (DbContextOptions<AppDbContext> options) : base (options) { }
    protected override void OnModelCreating (ModelBuilder builder) {
        base.OnModelCreating (builder);   
        // Bỏ tiền tố AspNet của các bảng: mặc định các bảng trong IdentityDbContext có  
        // tên với tiền tố AspNet như: AspNetUserRoles, AspNetUser ...  
        // Đoạn mã sau chạy khi khởi tạo DbContext, tạo database sẽ loại bỏ tiền tố đó  
        foreach (var entityType in builder.Model.GetEntityTypes ()) {  
            var tableName = entityType.GetTableName ();  
            if (tableName.StartsWith ("AspNet")) {  
                entityType.SetTableName (tableName.Substring (6));  
            }  
        }  
    }
}  
} 0 ... Bạn sẽ thấy các trang này đã làm việc, bạn đã có đầy đủ tính năng của Identity - Giờ chỉ cần tùy biến theo nhu cầu của bạn.

Thêm _LoginPartial.cshtml vào Layout

Lênh phát sinh code Identity cũng phát sinh ra một Partial tại

using Album.Models; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace Album.Data {

// Kế thừa từ IdentityDbContext nên có sẵn các DbSet  
// UserRoles Roles RoleClaimsUsers UserClaims UserLogins UserTokens  
public class AppDbContext : IdentityDbContext<AppUser> {
    public AppDbContext (DbContextOptions<AppDbContext> options) : base (options) { }
    protected override void OnModelCreating (ModelBuilder builder) {
        base.OnModelCreating (builder);   
        // Bỏ tiền tố AspNet của các bảng: mặc định các bảng trong IdentityDbContext có  
        // tên với tiền tố AspNet như: AspNetUserRoles, AspNetUser ...  
        // Đoạn mã sau chạy khi khởi tạo DbContext, tạo database sẽ loại bỏ tiền tố đó  
        foreach (var entityType in builder.Model.GetEntityTypes ()) {  
            var tableName = entityType.GetTableName ();  
            if (tableName.StartsWith ("AspNet")) {  
                entityType.SetTableName (tableName.Substring (6));  
            }  
        }  
    }
}  
} 1 với nội dung như sau:

dotnet add package System.Data.SqlClient dotnet add package Microsoft.EntityFrameworkCore dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Design dotnet add package Microsoft.Extensions.DependencyInjection dotnet add package Microsoft.Extensions.Logging.Console dotnet add package Microsoft.AspNetCore.Identity dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design dotnet add package Microsoft.AspNetCore.Identity.UI dotnet add package Microsoft.AspNetCore.Authentication dotnet add package Microsoft.AspNetCore.Http.Abstractions dotnet add package Microsoft.AspNetCore.Authentication.Cookies dotnet add package Microsoft.AspNetCore.Authentication.Facebook dotnet add package Microsoft.AspNetCore.Authentication.Google dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer dotnet add package Microsoft.AspNetCore.Authentication.MicrosoftAccount dotnet add package Microsoft.AspNetCore.Authentication.oAuth dotnet add package Microsoft.AspNetCore.Authentication.OpenIDConnect dotnet add package Microsoft.AspNetCore.Authentication.Twitter 9

Đoạn mã .cshtml này tạo ra cấu trúc HTML navbar-nav của Bootstrap hiện thị menu trên về thông tin người dùng đăng nhập, link bấm vào để đăng xuất hoặc đăng nhập.

Hãy đưa

using Album.Models; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace Album.Data {

// Kế thừa từ IdentityDbContext nên có sẵn các DbSet  
// UserRoles Roles RoleClaimsUsers UserClaims UserLogins UserTokens  
public class AppDbContext : IdentityDbContext<AppUser> {
    public AppDbContext (DbContextOptions<AppDbContext> options) : base (options) { }
    protected override void OnModelCreating (ModelBuilder builder) {
        base.OnModelCreating (builder);   
        // Bỏ tiền tố AspNet của các bảng: mặc định các bảng trong IdentityDbContext có  
        // tên với tiền tố AspNet như: AspNetUserRoles, AspNetUser ...  
        // Đoạn mã sau chạy khi khởi tạo DbContext, tạo database sẽ loại bỏ tiền tố đó  
        foreach (var entityType in builder.Model.GetEntityTypes ()) {  
            var tableName = entityType.GetTableName ();  
            if (tableName.StartsWith ("AspNet")) {  
                entityType.SetTableName (tableName.Substring (6));  
            }  
        }  
    }
}  
} 2 vào

using Album.Models; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace Album.Data {

// Kế thừa từ IdentityDbContext nên có sẵn các DbSet  
// UserRoles Roles RoleClaimsUsers UserClaims UserLogins UserTokens  
public class AppDbContext : IdentityDbContext<AppUser> {
    public AppDbContext (DbContextOptions<AppDbContext> options) : base (options) { }
    protected override void OnModelCreating (ModelBuilder builder) {
        base.OnModelCreating (builder);   
        // Bỏ tiền tố AspNet của các bảng: mặc định các bảng trong IdentityDbContext có  
        // tên với tiền tố AspNet như: AspNetUserRoles, AspNetUser ...  
        // Đoạn mã sau chạy khi khởi tạo DbContext, tạo database sẽ loại bỏ tiền tố đó  
        foreach (var entityType in builder.Model.GetEntityTypes ()) {  
            var tableName = entityType.GetTableName ();  
            if (tableName.StartsWith ("AspNet")) {  
                entityType.SetTableName (tableName.Substring (6));  
            }  
        }  
    }
}  
} 3 để tất cả các trang đều xuất hiện menu này. Mở

using Album.Models; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace Album.Data {

// Kế thừa từ IdentityDbContext nên có sẵn các DbSet  
// UserRoles Roles RoleClaimsUsers UserClaims UserLogins UserTokens  
public class AppDbContext : IdentityDbContext<AppUser> {
    public AppDbContext (DbContextOptions<AppDbContext> options) : base (options) { }
    protected override void OnModelCreating (ModelBuilder builder) {
        base.OnModelCreating (builder);   
        // Bỏ tiền tố AspNet của các bảng: mặc định các bảng trong IdentityDbContext có  
        // tên với tiền tố AspNet như: AspNetUserRoles, AspNetUser ...  
        // Đoạn mã sau chạy khi khởi tạo DbContext, tạo database sẽ loại bỏ tiền tố đó  
        foreach (var entityType in builder.Model.GetEntityTypes ()) {  
            var tableName = entityType.GetTableName ();  
            if (tableName.StartsWith ("AspNet")) {  
                entityType.SetTableName (tableName.Substring (6));  
            }  
        }  
    }
}  
} 3 thêm vào

using Album.Models; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace Album.Data {

// Kế thừa từ IdentityDbContext nên có sẵn các DbSet  
// UserRoles Roles RoleClaimsUsers UserClaims UserLogins UserTokens  
public class AppDbContext : IdentityDbContext<AppUser> {
    public AppDbContext (DbContextOptions<AppDbContext> options) : base (options) { }
    protected override void OnModelCreating (ModelBuilder builder) {
        base.OnModelCreating (builder);   
        // Bỏ tiền tố AspNet của các bảng: mặc định các bảng trong IdentityDbContext có  
        // tên với tiền tố AspNet như: AspNetUserRoles, AspNetUser ...  
        // Đoạn mã sau chạy khi khởi tạo DbContext, tạo database sẽ loại bỏ tiền tố đó  
        foreach (var entityType in builder.Model.GetEntityTypes ()) {  
            var tableName = entityType.GetTableName ();  
            if (tableName.StartsWith ("AspNet")) {  
                entityType.SetTableName (tableName.Substring (6));  
            }  
        }  
    }
}  
} 5, thêm dúng vị trí nav:

dotnet tool install --global dotnet-ef

0

Hướng dẫn làm đăng nhập dùng html trong asp.net

Một số lưu ý về code trong _LoginPartial.cshtml:

dotnet tool install --global dotnet-ef

1

Hai dòng trên để Inject hai dịch vụ của Identity là UserManger (quản lý User: thêm, xóa, sửa ...) và SignnInManager (quản lý đăng nhập) vào Razor Page.

Trong Controller, PageModel, View, Razor Page đều có thuộc tính

using Album.Models; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace Album.Data {

// Kế thừa từ IdentityDbContext nên có sẵn các DbSet  
// UserRoles Roles RoleClaimsUsers UserClaims UserLogins UserTokens  
public class AppDbContext : IdentityDbContext<AppUser> {
    public AppDbContext (DbContextOptions<AppDbContext> options) : base (options) { }
    protected override void OnModelCreating (ModelBuilder builder) {
        base.OnModelCreating (builder);   
        // Bỏ tiền tố AspNet của các bảng: mặc định các bảng trong IdentityDbContext có  
        // tên với tiền tố AspNet như: AspNetUserRoles, AspNetUser ...  
        // Đoạn mã sau chạy khi khởi tạo DbContext, tạo database sẽ loại bỏ tiền tố đó  
        foreach (var entityType in builder.Model.GetEntityTypes ()) {  
            var tableName = entityType.GetTableName ();  
            if (tableName.StartsWith ("AspNet")) {  
                entityType.SetTableName (tableName.Substring (6));  
            }  
        }  
    }
}  
} 6 kiểu

using Album.Models; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace Album.Data {

// Kế thừa từ IdentityDbContext nên có sẵn các DbSet  
// UserRoles Roles RoleClaimsUsers UserClaims UserLogins UserTokens  
public class AppDbContext : IdentityDbContext<AppUser> {
    public AppDbContext (DbContextOptions<AppDbContext> options) : base (options) { }
    protected override void OnModelCreating (ModelBuilder builder) {
        base.OnModelCreating (builder);   
        // Bỏ tiền tố AspNet của các bảng: mặc định các bảng trong IdentityDbContext có  
        // tên với tiền tố AspNet như: AspNetUserRoles, AspNetUser ...  
        // Đoạn mã sau chạy khi khởi tạo DbContext, tạo database sẽ loại bỏ tiền tố đó  
        foreach (var entityType in builder.Model.GetEntityTypes ()) {  
            var tableName = entityType.GetTableName ();  
            if (tableName.StartsWith ("AspNet")) {  
                entityType.SetTableName (tableName.Substring (6));  
            }  
        }  
    }
}  
} 7 là mẩu tin về User của phiên làm việc, để kiểm tra có User đăng nhập thì gọi:

dotnet tool install --global dotnet-ef

2

Để lấy tên UserName của User của phiên làm việc:

dotnet tool install --global dotnet-ef

3

Thêm trang thông báo khi chuyển hướng

Trong nhiều trường hợp khi hoàn thành một tác vụ thì chuyển hướng đến trang đích nào đó, ví dụ sau khi đăng ký xong tài khoản thì chuyển về trang chủ. Ở đây xây dựng thêm chức năng hiện thị một thống báo rồi mới chuyển hướng, ví dụ thông báo cho biết đã đăng ký tài khỏan thành công - nhưng cần xác nhận địa chỉ email, thông báo hiện thị vài giây rồi chuyển hướng.

Hãy copy mã nguồn ViewComponent có tên MessagePage tạo trang thông báo tại vào dự án để sử dụng ngay

Trong các Action nào muốn chuyển hướng, chỉ việc gọi:

dotnet tool install --global dotnet-ef

4

Các cấu hình và thiết lập cơ bản đã xong, giờ chỉ việc tùy biến theo nhu cầu

Trang đăng ký tài khoản User - Identity

Nội dung của trang này phát sinh tại

using Album.Models; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace Album.Data {

// Kế thừa từ IdentityDbContext nên có sẵn các DbSet  
// UserRoles Roles RoleClaimsUsers UserClaims UserLogins UserTokens  
public class AppDbContext : IdentityDbContext<AppUser> {
    public AppDbContext (DbContextOptions<AppDbContext> options) : base (options) { }
    protected override void OnModelCreating (ModelBuilder builder) {
        base.OnModelCreating (builder);   
        // Bỏ tiền tố AspNet của các bảng: mặc định các bảng trong IdentityDbContext có  
        // tên với tiền tố AspNet như: AspNetUserRoles, AspNetUser ...  
        // Đoạn mã sau chạy khi khởi tạo DbContext, tạo database sẽ loại bỏ tiền tố đó  
        foreach (var entityType in builder.Model.GetEntityTypes ()) {  
            var tableName = entityType.GetTableName ();  
            if (tableName.StartsWith ("AspNet")) {  
                entityType.SetTableName (tableName.Substring (6));  
            }  
        }  
    }
}  
} 8 truy cập qua địa chỉ

using Album.Models; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace Album.Data {

// Kế thừa từ IdentityDbContext nên có sẵn các DbSet  
// UserRoles Roles RoleClaimsUsers UserClaims UserLogins UserTokens  
public class AppDbContext : IdentityDbContext<AppUser> {
    public AppDbContext (DbContextOptions<AppDbContext> options) : base (options) { }
    protected override void OnModelCreating (ModelBuilder builder) {
        base.OnModelCreating (builder);   
        // Bỏ tiền tố AspNet của các bảng: mặc định các bảng trong IdentityDbContext có  
        // tên với tiền tố AspNet như: AspNetUserRoles, AspNetUser ...  
        // Đoạn mã sau chạy khi khởi tạo DbContext, tạo database sẽ loại bỏ tiền tố đó  
        foreach (var entityType in builder.Model.GetEntityTypes ()) {  
            var tableName = entityType.GetTableName ();  
            if (tableName.StartsWith ("AspNet")) {  
                entityType.SetTableName (tableName.Substring (6));  
            }  
        }  
    }
}  
} 9, trước tiên cấu hình để địa chỉ url ngắn gọn là

public void ConfigureServices(IServiceCollection services) {

// Đăng ký AppDbContext services.AddDbContext<AppDbContext>(options => { // Đọc chuỗi kết nối string connectstring = Configuration.GetConnectionString("AppDbContext"); // Sử dụng MS SQL Server options.UseSqlServer(connectstring); });

services.AddRazorPages();  
} 0, mở

public void ConfigureServices(IServiceCollection services) {

// Đăng ký AppDbContext services.AddDbContext<AppDbContext>(options => { // Đọc chuỗi kết nối string connectstring = Configuration.GetConnectionString("AppDbContext"); // Sử dụng MS SQL Server options.UseSqlServer(connectstring); });

services.AddRazorPages();  
} 1 sửa dòng @page thành

dotnet tool install --global dotnet-ef

5

Mặc định trang đăng ký này yêu cầu thông tin gồm email và password - email vừa cập nhật vào email của user và cũng dùng làm UserName. Ta sẽ cấu hình cần form nhập cả UserName nữa. Có sẽ như sau, các vấn đề giải thích trong comment của code

Register.cshtml.cs

dotnet tool install --global dotnet-ef

6

Một số lưu ý của code trên: Hai dịch vụ của Identity được sử dụng là UserManager và UserSignIn được Inject vào PageModel qua phương thức khởi tạo

  • Thuộc tính

    public void ConfigureServices(IServiceCollection services) {

    // Đăng ký AppDbContext services.AddDbContext<AppDbContext>(options => { // Đọc chuỗi kết nối string connectstring = Configuration.GetConnectionString("AppDbContext"); // Sử dụng MS SQL Server options.UseSqlServer(connectstring); });
    services.AddRazorPages();  
    
    } 2 để xác nhận quyền người dùng không đăng nhập vẫn được quyền truy cập Page đó.
  • Trong InputModel đã thêm vào

    public void ConfigureServices(IServiceCollection services) {

    // Đăng ký AppDbContext services.AddDbContext<AppDbContext>(options => { // Đọc chuỗi kết nối string connectstring = Configuration.GetConnectionString("AppDbContext"); // Sử dụng MS SQL Server options.UseSqlServer(connectstring); });
    services.AddRazorPages();  
    
    } 3 để xây dựng Form cần nhập cả Email và UserName
  • Để tạo mới một User dùng phương thức

    public void ConfigureServices(IServiceCollection services) {

    // Đăng ký AppDbContext services.AddDbContext<AppDbContext>(options => { // Đọc chuỗi kết nối string connectstring = Configuration.GetConnectionString("AppDbContext"); // Sử dụng MS SQL Server options.UseSqlServer(connectstring); });
    services.AddRazorPages();  
    
    }

    4 nó trả về IdentityResult, nếu IdentityResult.Succeeded bằng public void ConfigureServices(IServiceCollection services) {

    // Đăng ký AppDbContext services.AddDbContext<AppDbContext>(options => { // Đọc chuỗi kết nối string connectstring = Configuration.GetConnectionString("AppDbContext"); // Sử dụng MS SQL Server options.UseSqlServer(connectstring); });
    services.AddRazorPages();  
    
    } 5 thì đã thêm user thành công
  • public void ConfigureServices(IServiceCollection services)

    {

    // Đăng ký AppDbContext services.AddDbContext<AppDbContext>(options => { // Đọc chuỗi kết nối string connectstring = Configuration.GetConnectionString("AppDbContext"); // Sử dụng MS SQL Server options.UseSqlServer(connectstring); });
    services.AddRazorPages();  
    
    } 6 để phát sinh một mã Token duy nhất theo thông tin của User, mã này được dùng để xác nhận email đăng ký là có thật.
  • Nếu có đối tượng IdentityUser thì có thể đăng nhập bằng phương thức

    public void ConfigureServices(IServiceCollection services) {

    // Đăng ký AppDbContext services.AddDbContext<AppDbContext>(options => { // Đọc chuỗi kết nối string connectstring = Configuration.GetConnectionString("AppDbContext"); // Sử dụng MS SQL Server options.UseSqlServer(connectstring); });
    services.AddRazorPages();  
    
    } 7

Nội dung trang View của Register sửa lại thành như sau

Register.cshtml

dotnet tool install --global dotnet-ef

7

Với trang này thì đã có thể đăng ký tài khoản vào hệ thống, tuy nhiên để hoàn chỉnh cập nhật thêm cả các trang RegisterConfirmation, ConfirmEmail

Trang RegisterConfirmation và ConfirmEmail

RegisterConfirmation

Trang này chỉ có chức năng hiện thị thông báo cần kích hoạt email, sau khi người dùng đăng ký, cập nhật thành

RegisterConfirmation.cshtml.cs

dotnet tool install --global dotnet-ef

8

RegisterConfirmation.cshtml

dotnet tool install --global dotnet-ef

9

Trang ConfirmEmail

Trang này dùng để chứng thực email đăng ký của người dùng là thật, nó nhận thông tin là userid và mã token trong url truy cập, dùng hai thông tin này để xác thực, code sửa có dạng như sau:

ConfirmEmail.cshtml.cs

"ConnectionStrings": {

"AppDbContext": "Data Source=localhost,1433; Initial Catalog=albumdb; User ID=SA;Password=Password123"  
} 0

ConfirmEmail.cshtml

"ConnectionStrings": {

"AppDbContext": "Data Source=localhost,1433; Initial Catalog=albumdb; User ID=SA;Password=Password123"  
} 1

Đăng ký thử User

Điền thông tin và đăng ký

Hướng dẫn làm đăng nhập dùng html trong asp.net

Sau khi bấm gửi, nếu dữ liệu đúng - User tạo thành công thì nó chuyển hướng đến

Hướng dẫn làm đăng nhập dùng html trong asp.net

Đồng thời một email được gửi đi - nội dung email đó dạng:

Hướng dẫn làm đăng nhập dùng html trong asp.net

Người dùng bấm vào link trong email để chứng thực email, nó chuyển đến trang để chứng thực - nếu thành công thì tự động đăng nhập luônn và có thông báo

Hướng dẫn làm đăng nhập dùng html trong asp.net

Tài khỏa đã đăng nhập

Hướng dẫn làm đăng nhập dùng html trong asp.net

Trang Log Out

Trang Logout để User đang nhập xác nhận tiến hành đăng xuất (Logout). Để đăng xuất User của phiên làm việc đơn giản gọi

public void ConfigureServices(IServiceCollection services) {

// Đăng ký AppDbContext services.AddDbContext<AppDbContext>(options => { // Đọc chuỗi kết nối string connectstring = Configuration.GetConnectionString("AppDbContext"); // Sử dụng MS SQL Server options.UseSqlServer(connectstring); });

services.AddRazorPages();  
} 8. Ta sửa trang Logout như sau:

Logout.cshtml.cs

"ConnectionStrings": {

"AppDbContext": "Data Source=localhost,1433; Initial Catalog=albumdb; User ID=SA;Password=Password123"  
} 2

Logout.cshtml

"ConnectionStrings": {

"AppDbContext": "Data Source=localhost,1433; Initial Catalog=albumdb; User ID=SA;Password=Password123"  
} 3

Thực tế không dùng đến

public void ConfigureServices(IServiceCollection services) {

// Đăng ký AppDbContext services.AddDbContext<AppDbContext>(options => { // Đọc chuỗi kết nối string connectstring = Configuration.GetConnectionString("AppDbContext"); // Sử dụng MS SQL Server options.UseSqlServer(connectstring); });

services.AddRazorPages();  
} 9 để Post xác nhận mà việc Post đăng xuất thực hiện trong

using Album.Models; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace Album.Data {

// Kế thừa từ IdentityDbContext nên có sẵn các DbSet  
// UserRoles Roles RoleClaimsUsers UserClaims UserLogins UserTokens  
public class AppDbContext : IdentityDbContext<AppUser> {
    public AppDbContext (DbContextOptions<AppDbContext> options) : base (options) { }
    protected override void OnModelCreating (ModelBuilder builder) {
        base.OnModelCreating (builder);   
        // Bỏ tiền tố AspNet của các bảng: mặc định các bảng trong IdentityDbContext có  
        // tên với tiền tố AspNet như: AspNetUserRoles, AspNetUser ...  
        // Đoạn mã sau chạy khi khởi tạo DbContext, tạo database sẽ loại bỏ tiền tố đó  
        foreach (var entityType in builder.Model.GetEntityTypes ()) {  
            var tableName = entityType.GetTableName ();  
            if (tableName.StartsWith ("AspNet")) {  
                entityType.SetTableName (tableName.Substring (6));  
            }  
        }  
    }
}  
} 2 ở đoạn code

"ConnectionStrings": {

"AppDbContext": "Data Source=localhost,1433; Initial Catalog=albumdb; User ID=SA;Password=Password123"  
} 4

Như vậy nếu người dùng đăng nhấp, bấm vào Đăng xuất ở menu phải sẽ đăng xuất.

Trang Log In

Trang Login để người dùng đăng nhập. Ta tùy biến để người dùng nhập UserName hoặc Email và Password để đăng nhập. Toàn bộ code như sau:

Login.cshtml.cs

"ConnectionStrings": {

"AppDbContext": "Data Source=localhost,1433; Initial Catalog=albumdb; User ID=SA;Password=Password123"  
} 5

Login.cshtml

"ConnectionStrings": {

"AppDbContext": "Data Source=localhost,1433; Initial Catalog=albumdb; User ID=SA;Password=Password123"  
} 6

Hướng dẫn làm đăng nhập dùng html trong asp.net

Mã nguồn tham khảo ASP_NET_CORE/Album hoặc tải về phiên bản của bài này ex063