API web xác thực mã thông báo JWT

Trong bài viết này, tôi sẽ thảo luận về cách triển khai Xác thực dựa trên mã thông báo trong API Web để bảo mật tài nguyên máy chủ bằng một ví dụ. Vui lòng đọc bài viết trước của chúng tôi, nơi chúng tôi đã thảo luận cách triển khai Trình xử lý thông báo HTTP phía máy khách với một số ví dụ. Là một phần của bài viết này, chúng ta sẽ thảo luận về các gợi ý sau

  1. Tại sao chúng ta cần Xác thực dựa trên mã thông báo trong API Web?
  2. Ưu điểm của việc sử dụng Xác thực dựa trên mã thông báo trong ASP. NET webAPI
  3. Xác thực dựa trên mã thông báo hoạt động như thế nào?
  4. Triển khai xác thực dựa trên mã thông báo trong API Web
  5. Kiểm tra xác thực mã thông báo bằng Postman
Tại sao chúng ta cần Xác thực dựa trên mã thông báo trong API Web?

ASP. NET Web API là một khung lý tưởng, do Microsoft cung cấp, để xây dựng Web API, tôi. e. Các dịch vụ dựa trên HTTP ở trên cùng của. Nền tảng NET. Sau khi chúng tôi phát triển các dịch vụ bằng API Web thì các dịch vụ này sẽ được nhiều khách hàng sử dụng, chẳng hạn như

  1. trình duyệt
  2. Ứng dụng di động
  3. Ứng dụng máy tính để bàn
  4. IOT, v.v.

Ngày nay, việc sử dụng API WEB đang gia tăng một cách nhanh chóng. Vì vậy, là một nhà phát triển, bạn nên biết cách phát triển API Web. Chỉ phát triển API Web là không đủ nếu không có bảo mật. Vì vậy, điều rất quan trọng đối với chúng tôi với tư cách là nhà phát triển là triển khai bảo mật cho tất cả các loại máy khách [chẳng hạn như Trình duyệt, Thiết bị di động, ứng dụng Máy tính để bàn và IoT], những người sẽ sử dụng dịch vụ API Web của chúng tôi

Cách tiếp cận ưa thích nhất hiện nay để bảo mật tài nguyên API Web là xác thực người dùng trong máy chủ Web API bằng cách sử dụng mã thông báo đã ký [chứa đủ thông tin để xác định một người dùng cụ thể] cần được gửi tới máy chủ bởi máy khách với mỗi và . Đây được gọi là phương pháp Xác thực dựa trên mã thông báo

Xác thực dựa trên mã thông báo hoạt động như thế nào?

Để hiểu cách hoạt động của xác thực dựa trên mã thông báo, vui lòng xem sơ đồ sau

Xác thực dựa trên mã thông báo hoạt động như sau

  1. Người dùng nhập thông tin đăng nhập của mình [i. e. tên người dùng và mật khẩu] vào ứng dụng khách [ở đây ứng dụng khách có nghĩa là trình duyệt hoặc thiết bị di động, v.v.]
  2. Sau đó, khách hàng sẽ gửi các thông tin đăng nhập này [i. e. tên người dùng và mật khẩu] đến Máy chủ ủy quyền
  3. Sau đó, Máy chủ ủy quyền xác thực thông tin đăng nhập của khách hàng [i. e. tên người dùng và mật khẩu], đồng thời tạo và trả lại mã thông báo truy cập. Mã thông báo truy cập này chứa đủ thông tin để xác định người dùng và cũng chứa thời gian hết hạn của mã thông báo
  4. Sau đó, ứng dụng khách bao gồm Mã thông báo truy cập trong tiêu đề Ủy quyền của yêu cầu HTTP để truy cập các tài nguyên bị hạn chế từ Máy chủ tài nguyên cho đến khi mã thông báo hết hạn

Ghi chú. Nếu điều này không rõ ràng vào lúc này thì đừng lo lắng, chúng tôi sẽ giải thích chi tiết từng điểm được đề cập ở trên bằng ví dụ

Hãy thảo luận về quy trình từng bước để triển khai Xác thực dựa trên mã thông báo trong API Web và sau đó chúng ta cũng sẽ xem cách sử dụng xác thực dựa trên mã thông báo để truy cập các tài nguyên bị hạn chế bằng Postman và Fiddler

Bước 1. Tạo cơ sở dữ liệu cần thiết

Chúng tôi sẽ sử dụng bảng UserMaster sau đây trong bản demo này

Vui lòng sử dụng Tập lệnh SQL bên dưới để tạo và điền vào bảng UserMaster với dữ liệu mẫu được yêu cầu

CREATE DATABASE SECURITY_DB
GO

USE [SECURITY_DB]

CREATE TABLE UserMaster
[
  UserID INT PRIMARY KEY,
  UserName VARCHAR[50],
  UserPassword VARCHAR[50],
  UserRoles VARCHAR[500],
  UserEmailID VARCHAR[100],
]
GO

INSERT INTO UserMaster VALUES[101, 'Anurag', '123456', 'Admin', 'Anurag@g.com']
INSERT INTO UserMaster VALUES[102, 'Priyanka', 'abcdef', 'User', 'Priyanka@g.com']
INSERT INTO UserMaster VALUES[103, 'Sambit', '123pqr', 'SuperAdmin', 'Sambit@g.com']
INSERT INTO UserMaster VALUES[104, 'Pranaya', 'abc123', 'Admin, User', 'Pranaya@g.com']
GO
Bước 2. Tạo Dự án API Web trống với tên TokenAuthenticationWEBAPI

Vào menu Tệp > tạo > dự án > tại đây chọn “asp. ứng dụng web net” dưới web. Cung cấp tên ứng dụng là TokenAuthenticationWEBAPI và chọn vị trí dự án mà bạn muốn tạo dự án. Sau đó bấm vào nút OK như trong hình bên dưới

Sau khi bạn nhấp vào nút OK, một cửa sổ mới sẽ mở ra với Tên ASP mới. NET để chọn Mẫu dự án và từ cửa sổ này, bạn cần chọn mẫu dự án Empty vì chúng ta sẽ làm mọi thứ từ đầu, sau đó chọn hộp kiểm MVC và Web API từ Thêm thư mục và tham chiếu cốt lõi cho rồi nhấp vào

Bước 3. Thêm các tham chiếu cần thiết từ các gói NuGet vào ứng dụng của bạn

Để triển khai xác thực dựa trên mã thông báo trong ASP. NET Web API, chúng ta cần cài đặt các tham chiếu sau từ các gói NuGet. Phần sau của bài viết này, chúng tôi sẽ thảo luận về việc sử dụng từng gói bên dưới

  1. Microsoft. sở hữu. Chủ nhà. Hệ thốngWeb
  2. Microsoft. sở hữu. Bảo vệ. OAuth
  3. Microsoft. sở hữu. Cors
  4. Newtonsoft. json

Để thêm các tài liệu tham khảo ở trên từ NuGet, hãy truy cập Solution Explorer > Nhấp chuột phải vào Tài liệu tham khảo > Nhấp vào Quản lý các gói NuGet > Tìm kiếm Microsoft. sở hữu. Chủ nhà. SystemWeb,  Microsoft. sở hữu. Bảo vệ. OAuth, Microsoft. sở hữu. Cors và Newtonsoft. json  và cài đặt.

Ghi chú. Khi bạn cài đặt các gói trên, các tham chiếu phụ thuộc cũng được tự động cài đặt vào ứng dụng của bạn

Bước 4. Tạo ADO. NET Entity Data Model

Ở đây, chúng ta sẽ sử dụng Phương pháp tiếp cận đầu tiên của DB đối với Khung thực thể để tạo Mô hình dữ liệu thực thể dựa trên cơ sở dữ liệu SECURITY_DB mà chúng ta đã tạo và sau đó chọn bảng UserMaster từ cơ sở dữ liệu SECURITY_DB

Bước5. Tạo một lớp Kho lưu trữ

Bây giờ, bạn cần tạo một lớp có tên UserMasterRepository sẽ xác thực người dùng và cũng trả về thông tin người dùng. Như bạn có thể thấy trong đoạn mã dưới đây, phương thức ValidateUser lấy tên người dùng và mật khẩu làm tham số đầu vào và sau đó xác thực điều này. Nếu tên người dùng và mật khẩu hợp lệ thì nó sẽ trả về đối tượng UserMaster nếu không nó sẽ trả về null. Sau đó chúng ta sẽ thảo luận khi nào và ở đâu chúng ta sẽ sử dụng phương pháp này

namespace TokenAuthenticationInWebAPI.Models
{
    public class UserMasterRepository : IDisposable
    {
        // SECURITY_DBEntities it is your context class
        SECURITY_DBEntities context = new SECURITY_DBEntities[];

        //This method is used to check and validate the user credentials
        public UserMaster ValidateUser[string username, string password]
        {
            return context.UserMasters.FirstOrDefault[user =>
            user.UserName.Equals[username, StringComparison.OrdinalIgnoreCase]
            && user.UserPassword == password];
        }

        public void Dispose[]
        {
            context.Dispose[];
        }
    }
}

Bước 6. Thêm một lớp để xác thực thông tin đăng nhập của người dùng yêu cầu mã thông báo

Bây giờ chúng ta cần thêm một lớp có tên MyAuthorizationServerProvider vào ứng dụng của mình. Trong lớp đó, chúng ta cần viết logic để xác thực thông tin đăng nhập của người dùng và tạo mã thông báo truy cập

Chúng ta cần kế thừa lớp MyAuthorizationServerProvider từ lớp OAuthAuthorizationServerProvider, sau đó cần ghi đè ValidateClientAuthentication . Vì vậy, trước khi tiếp tục và ghi đè hai phương thức này, trước tiên chúng ta hãy hiểu chính xác những gì các phương thức này sẽ thực hiện.  method. So, before proceeding and overriding these two methods, let us first understand what exactly these methods are going to perform.

Xác thực phương thức xác thực ứng dụng khách

Phương thức ValidateClientAuthentication được sử dụng để xác thực ứng dụng khách. Để đơn giản, chúng ta sẽ thảo luận chi tiết hơn về ứng dụng khách là gì và cách xác thực ứng dụng trong bài viết tiếp theo.

Phương thức GrantResourceOwnerCredentials

Phương thức GrantResourceOwnerCredentials được sử dụng để xác thực thông tin đăng nhập của khách hàng [i. e. tên người dùng và mật khẩu]. Nếu nó tìm thấy thông tin đăng nhập hợp lệ, thì chỉ nó mới tạo mã thông báo truy cập. Sau đó, máy khách sử dụng mã thông báo truy cập này có thể truy cập các tài nguyên được ủy quyền từ Máy chủ tài nguyên.

Như chúng ta đã thảo luận, mã thông báo truy cập đã ký chứa đủ thông tin để xác định người dùng. Bây giờ câu hỏi là làm thế nào. Hãy thảo luận về điều này một cách chi tiết

Trước tiên, chúng ta cần tạo một phiên bản của lớp ClaimsIdentity và hàm tạo của  ClaimsIdentity . Vì chúng tôi sẽ sử dụng Xác thực dựa trên mã thông báo, nên Loại xác thực là “ class, we need to pass the authentication type. As we are going to use the Token-Based Authentication, so the Authentication Type is “mã thông báo mang ”.

Sau khi chúng tôi tạo phiên bản  ClaimsIdentity , thì cần thêm các xác nhận quyền sở hữu như Vai trò, Tên và Email, v.v. vào phiên bản ClaimsIdentity. Đây là những thông tin người dùng sẽ được đưa vào mã thông báo truy cập đã ký. Bạn có thể thêm bất kỳ số lượng xác nhận quyền sở hữu nào và sau khi bạn thêm nhiều xác nhận quyền sở hữu hơn. kích thước mã thông báo sẽ tăng lên.

MyAuthorizationServerProvider

Tạo một tệp lớp có tên MyAuthorizationServerProvider. cs rồi sao chép và dán đoạn mã sau vào đó

using Microsoft.Owin.Security.OAuth;
using System.Security.Claims;
using System.Threading.Tasks;

namespace TokenAuthenticationInWebAPI.Models
{
    public class MyAuthorizationServerProvider : OAuthAuthorizationServerProvider
    {
        public override async Task ValidateClientAuthentication[OAuthValidateClientAuthenticationContext context]
        {
            context.Validated[];
        }

        public override async Task GrantResourceOwnerCredentials[OAuthGrantResourceOwnerCredentialsContext context]
        {
            using [UserMasterRepository _repo = new UserMasterRepository[]]
            {
                var user = _repo.ValidateUser[context.UserName, context.Password];
                if [user == null]
                {
                    context.SetError["invalid_grant", "Provided username and password is incorrect"];
                    return;
                }
                var identity = new ClaimsIdentity[context.Options.AuthenticationType];
                identity.AddClaim[new Claim[ClaimTypes.Role, user.UserRoles]];
                identity.AddClaim[new Claim[ClaimTypes.Name, user.UserName]];
                identity.AddClaim[new Claim["Email", user.UserEmailID]];

                context.Validated[identity];
            }
        }
    }
}
Bước7. Thêm lớp OWINStartup

Bây giờ chúng ta cần thêm lớp OWINStartup nơi chúng ta sẽ định cấu hình Máy chủ ủy quyền OAuth. Đây sẽ là máy chủ ủy quyền của chúng tôi

Để làm như vậy, hãy vào Solution Explorer > Nhấp chuột phải vào Tên dự án từ Solution Explorer > Thêm > Mục mới > Chọn lớp Khởi động OWIN > Nhập tên lớp là Khởi động. cs > rồi nhấp vào nút Thêm như trong hình bên dưới

Khi bạn đã tạo lớp Khởi động Owin, hãy sao chép và dán mã bên dưới vào đó

using System;
using Microsoft.Owin;
using Owin;
using TokenAuthenticationInWebAPI.Models;
using Microsoft.Owin.Security.OAuth;
using System.Web.Http;

[assembly: OwinStartup[typeof[TokenAuthenticationInWebAPI.App_Start.Startup]]]

namespace TokenAuthenticationInWebAPI.App_Start
{
    // In this class we will Configure the OAuth Authorization Server.
    public class Startup
    {
        public void Configuration[IAppBuilder app]
        {
            // Enable CORS [cross origin resource sharing] for making request using browser from different domains
            app.UseCors[Microsoft.Owin.Cors.CorsOptions.AllowAll];
            
            OAuthAuthorizationServerOptions options = new OAuthAuthorizationServerOptions
            {
                AllowInsecureHttp = true,

                //The Path For generating the Toekn
                TokenEndpointPath = new PathString["/token"],

                //Setting the Token Expired Time [24 hours]
                AccessTokenExpireTimeSpan = TimeSpan.FromDays[1],

                //MyAuthorizationServerProvider class will validate the user credentials
                Provider = new MyAuthorizationServerProvider[]
            };

            //Token Generations
            app.UseOAuthAuthorizationServer[options];
            app.UseOAuthBearerAuthentication[new OAuthBearerAuthenticationOptions[]];
            
            HttpConfiguration config = new HttpConfiguration[];
            WebApiConfig.Register[config];
        }
    }
}
Hiểu mã lớp Khởi động Owin

Ở đây, chúng ta đã tạo một phiên bản mới của lớp OAuthAuthorizationServerOptions  rồi đặt các tùy chọn của nó như sau.

  1. Ở đây, chúng tôi đặt đường dẫn để tạo mã thông báo làhttp. //máy chủ cục bộ. số cổng/mã thông báo ”. Sau đó, chúng ta sẽ xem cách đưa ra yêu cầu Bài đăng HTTP để tạo mã thông báo truy cập.
  2. Chúng tôi đã chỉ định thời gian hết hạn cho mã thông báo truy cập là 24 giờ. Vì vậy, nếu người dùng cố gắng sử dụng cùng một mã thông báo truy cập sau 24 giờ kể từ thời điểm phát hành, thì yêu cầu này sẽ bị từ chối và mã trạng thái HTTP 401 sẽ được trả về
  3. Chúng tôi cũng đã chỉ định cách triển khai về cách xác thực thông tin xác thực ứng dụng khách cho người dùng yêu cầu mã thông báo truy cập trong lớp tùy chỉnh có tên MyAuthorizationServerProvider .

Cuối cùng, chúng tôi đã chuyển các tùy chọn cho phương thức tiện ích UseOAuthAuthorizationServer sẽ thêm phần mềm trung gian xác thực vào quy trình bán hàng

Bước8. Thêm Trình điều khiển API Web.  

Bây giờ chúng ta cần tạo tài nguyên API Web. Để làm như vậy, hãy thêm Trình điều khiển API Web trống, nơi chúng tôi sẽ thêm một số phương thức hành động để chúng tôi có thể kiểm tra Xác thực dựa trên mã thông báo có hoạt động tốt hay không

Đi đến Solution Explorer > Nhấp chuột phải vào thư mục Bộ điều khiển > Thêm > Bộ điều khiển > Chọn Bộ điều khiển API WEB 2 – Làm trống > Nhấp vào nút Thêm. > Nhập tên bộ điều khiển là TestController. cs > cuối cùng nhấp vào nút Thêm sẽ tạo TestController

Khi bạn đã tạo TestController, hãy sao chép và dán đoạn mã sau

using System.Linq;
using System.Security.Claims;
using System.Web.Http;

namespace TokenAuthenticationInWebAPI.Controllers
{
    public class TestController : ApiController
    {
        //This resource is For all types of role
        [Authorize[Roles = "SuperAdmin, Admin, User"]]
        [HttpGet]
        [Route["api/test/resource1"]]
        public IHttpActionResult GetResource1[]
        {
            var identity = [ClaimsIdentity]User.Identity;
            return Ok["Hello: " + identity.Name];
        }

        //This resource is only For Admin and SuperAdmin role
        [Authorize[Roles = "SuperAdmin, Admin"]]
        [HttpGet]
        [Route["api/test/resource2"]]
        public IHttpActionResult GetResource2[]
        {
            var identity = [ClaimsIdentity]User.Identity;            
            var Email = identity.Claims
                      .FirstOrDefault[c => c.Type == "Email"].Value;

            var UserName = identity.Name;
            
            return Ok["Hello " + UserName + ", Your Email ID is :" + Email];
        }

        //This resource is only For SuperAdmin role
        [Authorize[Roles = "SuperAdmin"]]
        [HttpGet]
        [Route["api/test/resource3"]]
        public IHttpActionResult GetResource3[]
        {
            var identity = [ClaimsIdentity]User.Identity;
            var roles = identity.Claims
                        .Where[c => c.Type == ClaimTypes.Role]
                        .Select[c => c.Value];
            return Ok["Hello " + identity.Name + "Your Role[s] are: " + string.Join[",", roles.ToList[]]];
        }
    }
}

Ở đây, trong bộ điều khiển trên, chúng tôi đã tạo ba tài nguyên như sau,

  1. /api/test/resource1 Tài nguyên này có thể được truy cập bởi cả ba loại vai trò như Quản trị viên, Quản trị viên cấp cao và Người dùng

Chủ Đề