Tài liệu thực hành ASP NET Core Web API IT Research Department BKAP 2022 Page | 1 JWT Authentication in ASP NET Core Web API Mục tiêu ● Tạo database Hanam88Service ● Tạo ứng dụng ASP NET Core Web API.
Tài liệu thực hành ASP.NET Core Web API JWT Authentication in ASP.NET Core Web API Mục tiêu ● Tạo database Hanam88Service ● Tạo ứng dụng ASP.NET Core Web API ● Sử dung Entity Framework (Database First) ● Cấu hình JWT ● Login sinh Token ● Cấu hình Authorize vào ProductController ● Test với Postman Step 1: Mở SQL Server 2012 cao chạy đoạn kịch để tạo sở liệu Create Database Hanam88Service go use Hanam88Service go TẠO BẢNG LOẠI SẢN PHẨM Create table Category ( CategoryId int identity primary key, CategoryName nvarchar(200) ) go -dữ liệu insert into Category values(N'Kính') insert into Category values(N'Ví da') insert into Category values(N'Giầy Dép') insert into Category values(N'Quần áo') go TẠO BẢNG SẢN PHẨM Create table Product ( ProductId varchar(16) primary key, ProductName nvarchar(128), CategoryId int foreign key references Category(CategoryId) null, Picture nvarchar(512), Price float, Note nvarchar(max) ) go IT Research Department @BKAP 2022 Page | Tài liệu thực hành ASP.NET Core Web API Create table Account ( AccountId varchar(36) primary key, Username varchar(32), Password varchar(256), Email varchar(128), FullName nvarchar(64) ) go insert into Account values(NEWID(),'hanam88',lower(CONVERT(VARCHAR(32), HashBytes('md5', '123456'), 2)),'hanam88.congdong@gmail.com','Charles Chung') insert into Product values('AN001',N'Áo sơ mi',4,'',120000,N''); insert into Product values('BN002',N'Bộ đồ công sở trắng',4,'',140000,N''); insert into Product values('BN003',N'Bộ đồ công sở kẻ caro',4,'',80000,N''); insert into Product values('DN334',N'Đầm Bbd Thuỷ Thủ 334',4,'',160000,N''); insert into Product values('DN332',N'Đầm Bbd Thuỷ Thủ 332',4,'',180000,N''); insert into Product values('QJ119',N'Quần Jean Dài Nữ 13 ( 119)',4,'',180000,N''); insert into Product values('AC331',N'Set Caro 331',4,'',190000,N''); insert into Product values('QL54',N'Quần Legging Asos Nâng Mông Đen 54',4,'',120000,N''); insert into Product values('QD296',N'Quần Dài Đen + Áo Voan 296',4,'',145000,N''); insert into Product values('SM449',N'Sơ Mi Chấm Bi Khoét Vai 449',4,'',85000,N''); insert into Product values('VN009',N'Ví nữ dài họa tiết gấu da mềm đẹp 009',2,'',65000,N''); insert into Product values('VN001',N'Ví forever young đa di năng',2,'',65000,N''); insert into Product values('TV103',N'Ví Nữ Mini Da Thật Nhiều Ngăn TV103',2,'',500000,N''); insert into Product values('VN209',N'Ví Nữ Ngắn Da Bị Thật Cao Cấp Sáp Dầu Bóng Đẹp Thương Hiệu Chính Hãng Banyanu',2,'',185000,N''); Step 2: Mở Visual Studio 2017 -> Tạo ứng dụng ASP.NET Core Web Application IT Research Department @BKAP 2022 Page | Tài liệu thực hành ASP.NET Core Web API - Chọn thơng số hình nhận OK IT Research Department @BKAP 2022 Page | Tài liệu thực hành ASP.NET Core Web API Step 3: Tạo thư mục Models Project Step 4: Vào menu Tools -> NuGet Package Manager -> Package Manager Console gõ lệnh hình nhấn Enter để kết nối database sinh Entity DbContext Step 5: Mở tệp Hanam88ServiceContext.cs thư mục Models xóa đoạn code hình Step 6: Mở tệp appsettings.json nhập thơng số cấu sau IT Research Department @BKAP 2022 Page | Tài liệu thực hành ASP.NET Core Web API { "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts": "*", "ConnectionStrings": { "Hanam88ConnectSQL": "Server=localhost;database=Hanam88WebAPI;uid=sa;pwd=1234$;MultipleActiveResultSets=Tr ue" }, "Jwt": { "Issuer": "hanam88.com", "Audience": "sinhvienbkap", "Key": "demo_jwt_security_for_sinhvienbkap" } } Step 7: Mở tệp Startup.cs tìm phương thức ConfigureServices bổ sung code cấu hình ứng dụng khởi động sau //lấy key tệp cấu hình var key = Configuration["Jwt:Key"]; //mã hóa key var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)); //Add Authentication Bearer services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { //có kiểm tra Issuer (default true) ValidateIssuer = true, ValidIssuer = Configuration["Jwt:Issuer"], //có kiểm tra Audience (default true) ValidateAudience = true, ValidAudience = Configuration["Jwt:Audience"], //Đảm bảo phải có thời gian hết hạn token RequireExpirationTime = true, ValidateLifetime = true, //Chỉ key sử dụng token IssuerSigningKey = signingKey, RequireSignedTokens = true }; }); services.AddDbContext( options => options.UseSqlServer(Configuration.GetConnectionString("Hanam88ConnectSQL"))); Tìm phương thức Configure bổ sung dịng sau vào trước lệnh app.UseMvc() //sử dụng tính Authentication app.UseAuthentication(); IT Research Department @BKAP 2022 Page | Tài liệu thực hành ASP.NET Core Web API Step 8: Tạo lớp UserModel thư mục Models public class UserModel { public string Username { get; set; } public string Password { get; set; } } Step 9: Trong thư mục Controllers xóa tệp ValuesController tạo Controller có tên AccountController code sau [Route("api/[controller]")] [ApiController] public class AccountController : ControllerBase { Hanam88WebAPIContext db; IConfiguration config; public AccountController(Hanam88WebAPIContext db, IConfiguration config) { this.db = db; this.config = config; } [HttpPost("login")] public IActionResult Login([FromBody] UserModel model) { //mã hóa password thành chuỗi MD5 var password_md5 = GenerateMD5(model.Password); //lấy người dùng db var user = db.Account.FirstOrDefault(x => x.Username == model.Username && x.Password == password_md5); //nếu tồn xử lý sing token if (user != null) { //lấy key file cấu hình var key = config["Jwt:Key"]; //mã hóa ky var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)); //ký vào key mã hóa var signingCredential = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256); //tạo claims chứa thông tin người dùng (nếu cần) var claims = new List { new Claim(ClaimTypes.Role,"Admin"), new Claim(ClaimTypes.Name,model.Username), new Claim(ClaimTypes.MobilePhone,"0961902588"), new Claim(ClaimTypes.Country,"Vietnam"), }; //tạo token với thông số khớp với cấu hình startup để validate var token = new JwtSecurityToken ( issuer: config["Jwt:Issuer"], audience: config["Jwt:Audience"], expires: DateTime.Now.AddHours(1), signingCredentials: signingCredential, IT Research Department @BKAP 2022 Page | Tài liệu thực hành ASP.NET Core Web API claims: claims ); //sinh chuỗi token với thông số var hanam88token = new JwtSecurityTokenHandler().WriteToken(token); //trả kết cho client username chuỗi token return new JsonResult(new { username = model.Username, token = hanam88token }); } //trả lỗi return new JsonResult(new { message = "Đăng nhập sai" }); } //hàm mã hóa chuỗi sử dụng MD5 private string GenerateMD5(string input) { // Step 1, calculate MD5 hash from input MD5 md5 = System.Security.Cryptography.MD5.Create(); byte[] inputBytes = System.Text.Encoding.ASCII.GetBytes(input); byte[] hashBytes = md5.ComputeHash(inputBytes); // Step 2, convert byte array to hex string StringBuilder sb = new StringBuilder(); for (int i = 0; i < hashBytes.Length; i++) { sb.Append(hashBytes[i].ToString("x2")); } return sb.ToString(); } //lấy thông tin claims sau login [Authorize] [HttpGet("GetClaim")] public IActionResult GetClaims() { var claims = from c in User.Claims select new {Type=c.Type.Substring(c.Type.LastIndexOf("/")+1), c.Value }; return new JsonResult(claims); } [Authorize(Roles ="admin")] [HttpGet("GetAccount")] public IActionResult GetAccount() { return new JsonResult(new { message = "Xin chào Admin" }); } } Step 10: Trong thư mục Controllers tạo Controller có tên ProductController code sau [Route("api/[controller]")] [ApiController] [Authorize] public class ProductController : ControllerBase { //khai báo đối tượng context Hanam88WebAPIContext db; //phương thức constructor khởi tạo context IT Research Department @BKAP 2022 Page | Tài liệu thực hành ASP.NET Core Web API //(do cấu hình startup nên asp.net core tự khởi tạo DbContext nhận qua constructor) //tìm hiểu dependency inject net public ProductController(Hanam88WebAPIContext db) { this.db = db; } public IActionResult GetProducts() { return new JsonResult(db.Product); } } Step 11: Cài công cụ postman lên để test - Test UnAuthorize - Login để lấy token IT Research Department @BKAP 2022 Page | Tài liệu thực hành ASP.NET Core Web API Nhập thông tin sai Nhập thông tin IT Research Department @BKAP 2022 Page | Tài liệu thực hành ASP.NET Core Web API - Test gửi Token để truy cập tài nguyên hạn chế (Protected Resource) THE END IT Research Department @BKAP 2022 Page | 10 ... Hanam88WebAPIContext db; //phương thức constructor khởi tạo context IT Research Department @BKAP 2022 Page | Tài liệu thực hành ASP. NET Core Web API //(do cấu hình startup nên asp. net core tự... Step 2: Mở Visual Studio 2017 -> Tạo ứng dụng ASP. NET Core Web Application IT Research Department @BKAP 2022 Page | Tài liệu thực hành ASP. NET Core Web API - Chọn thơng số hình nhận OK IT Research... 6: Mở tệp appsettings.json nhập thơng số cấu sau IT Research Department @BKAP 2022 Page | Tài liệu thực hành ASP. NET Core Web API { "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts":