Viết một OpenIdConnect server


Hôm trước làm 2 clip về Authentication và Authorization xong nhưng vẫn cứ thấy thiếu thiếu, vì phần OAuth2 và OpenIdConnect (OIDC) mình nói hơi sơ sài, nghe lại cứ có cảm giác như nói cho xong bài hay chạy KPI vậy.

Làm cái gì mà không tới nơi tới chốn cảm giác nó rất bực mình, vậy nên nay lại ngồi cặm cụi viết một OpenIdConnect server, “from scratch” luôn, hi vọng khi nào xong mình sẽ làm một clip riêng về OAuth2, OIDC, sử dụng chương trình này làm demo, để mọi người thấy từng bước nó chạy, và id_token, access_token, refresh_token được tạo ra và quản lý như thế nào.

Client là một web ASP.NET, sử dụng thư viện OpenIdConnect và ASP.NET Identity để kết nối đến server demo thực hiện việc xác thực.

(mà thực ra server này hoàn toàn có thể viết lại để chạy trên Mini-Web-Server, không cần tới ASP.NET, biết đâu sau này rảnh rỗi lại migrate code sang đó 😅)

Các bạn cần nhấn nút phải vào solution và chọn “Configure Startup Projects”, cho nó Start 2 project là AuthorizationServer và Client, khi chạy Client lên, các bạn nhìn lên góc trên bên phải sẽ thấy link Login, sau đó bấm nút OpenIdConnect để thực hiện đăng nhập, khi đó nó sẽ chuyển sang app AuthorizationServer (chuyển sang port 7101), các bạn chọn User1 hoặc User2, nó sẽ chuyển trở lại app Client… (xem screenshot trong comment).

Có một app nữa là ResourceServer, mình chưa dùng tới, dự định là để demo phần OAuth2 với access_token và refresh_token.

Mình dùng trang này: https://mkjwk.org/ để tạo cặp khóa public/private key, dùng cho việc tạo chữ ký trên các token trên AuthorizationServer, cũng như verify trên Client.

Tóm tắt:

Có 3 project:

AuthorizationServer: 1 OIDC server viết bằng ASP.NET, quản lý người dùng và xác thực.

– ResourceServer: một ASP.NET project chứa các API cần gọi, vốn là các API demo có sẵn khi tạo 1 project API trong Visual Studio. Hàm API (“/weatherforcast/detailed”) được bảo vệ bằng [Authorize]. Project này dùng JWTBearer để thực hiện xác thực.

– Client: một ASP.NET project sử dụng ASP.NET Identity và cấu hình dùng OpenId Connect để xác thực nhờ AuthorizationServer. Sau khi xác thực xong, nó sẽ lưu lại access_token được cấp, mỗi khi gọi đến API được bảo vệ của ResourceServer, nó sẽ gửi kèm access_token.

Cơ chế xác thực các JWT dựa trên public/private key.

Happy coding!

Leave a comment