YuCheng's Site
    • Posts
    • [DB] Database
      • [SQL] CTE
      • [SQL] Merge
      • [SQL] Ranking
    • [OS] Linux
      • [Arch] 安裝(Virtualbox)
      • [CentOS] 設定網路靜態IP
      • [Ubuntu] SSH 連線
      • [Ubuntu] 設定網路靜態IP
    • [Secure] 安全性議題
      • [授權] OAuth 2.0 簡介
      • [授權] OAuth 2.0 授權許可
    • [Web] Web 相關
      • [Keycloak] docker 安裝
      • [Web] FontForge 造難字
      • [Web] 敏感性 GET 參數
      • [Web] 敏感性 GET 參數
    • [前端] Javascript
      • [JS] Array 常用方法
      • [JS] Object 常用方法
      • [JS] 各種模組(module)
      • [JS] 提升與暫時性死區
      • [JS] 非同步程式設計
      • [JS]原型繼承鏈模型
      • [Code] 格式化民國年
      • [Code] 複製元件內的文字
      • [DIY] 前端路由
      • [DIY] 開發 proxy
    • [前端] Typescript
      • [TS] 擴充標準內建物件
    • [前端] Vue
      • [Router] Navigation Guard 加入查詢參數
      • [TS] TS-Provide
      • [元件] CheckBox
      • [元件] Promise 元件方法
      • [元件] Transparent Wrapper
      • [元件] TypeScript 注意事項
      • [元件] 全域元件
    • [後端] .NET
      • [.NET] .NET 6 Web API 專案
      • [.NET] PDF 列印
      • [.NET] WebView2 單檔部屬
      • [.NET] 製作 Nuget package
      • [.NET] 開發階段專案敏感資料
      • [Snippet] DataTable轉Json
      • [Snippet] JsonElement 操作
      • [部屬手動] Ubuntu Nginx
      • [基礎] 非同步控制器
      • [練習] 認證與授權
        • [驗證與授權] 驗證與授權
        • [驗證與授權] 驗證設定
        • [驗證與授權] 驗證實例
        • [驗證與授權] 授權設定
        • [驗證與授權] 備註頁面
      • [練習] 即時聊天專案
        • [SignalR] 建立專案
        • [SignalR] 後端 Token 授權
        • [SignalR] 前端登入頁面
        • [SignalR] 後端 Token 認證
    • [後端] csharp
      • [Code] 處理民國年
      • [Code] 處理民國年
    • [系統] 軟體設計
      • [架構] 多層(layer)架構
      • [架構] 多層(tier)架構
      • [架構] 無暇的程式碼
      • [程式] 巢狀結構
      • [程設] 鏈式語法比較
    • [維運] Container 容器
      • [Basic] 學習資源
      • [Docker] 基礎指令
      • [Docker] 安裝
      • [K8s] 共享 tnsnames.ora
      • [K8S] 自架 K8S 腳本
    • [維運] DevOps
      • [Git] orphan branch/worktree
      • [Git] Release Action (Dotnet)
      • [Git] Release Action (Vue)
      • [K8S] K8S 安裝
      • [SonarQube] 安裝與.NET 檢測
    • [HIS] FHIR
      • [SMART] Overview
    • [其他] Other
      • [智能家居] Home Assistant
        • [安裝] Home Assistant 安裝
      • [Bot] Telegram Bot
      • [DIY] 一鍵登入台灣杉
      • [Hugo] Toha Theme
      • [OpenWrt] Docker
      • [工具] Gdrive CLI / Linux
      • [工具] openapi generator
      • [工具] Vim Plugin YCM
      • [授權] OAuth2.0
    Hero Image
    [SignalR] Websocket 即時聊天程式(三) - 後端 Token 認證

    安裝套件 要進行 Token 的認證,需要先安裝 Microsoft.AspNetCore.Authentication.JwtBearer 套件: dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer 註冊認證服務 新增一個檔案 DependencyInjection.cs,在當中製作 IServiceCollection 的擴充方法來自定義 JWT token 認證服務, 在裡面設置 Token 的認證規則、使用者識別碼對應、使用者群組對應, 而 SignalR 抓取使用者識別碼 (UserIdentifier) 的介面方法是 IUserIdProvider.GetUserId, 因此我們需要另外新增一個實作 IUserProvider 的類別注入服務容器給 SignalR 使用 ,該檔案程式碼如下: using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; using System.Diagnostics.CodeAnalysis; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Threading.Tasks; namespace SignalR.Extensions.DependencyInjection { public static class MyAddConfig { public static IServiceCollection AddMyJWTAuth( [NotNull] this IServiceCollection services, IConfiguration config ) { services.

    November 20, 2020 Read
    Hero Image
    [SignalR] Websocket 即時聊天程式(四) - 前端登入頁面

    安裝 axios SignalR 連線驗證的方式是將 token 夾帶於網址參數中發送到伺服器,因此進行 websocket 連線前我們透過 ajax 向伺服器發送帳號密碼索取登入的 Token,我們安裝方便使用 ajax 的 axios 函式庫: axios 一樣可以透過 LibMan 安裝~ libman install axios@latest \ -p unpkg \ -d wwwroot/js/axios \ --files dist/axios.min.js 在 wwwRoot/index.html 添加對 axios 的引用: <script src="./lib/axios/dist/axios.min.js"></script> 簡易登入UI 雖然是功能原型,為了讓做出來的頁面不要太粗暴,拿 bootstrap 的 css 來套用一下 UI: libman install [email protected] \ -p unpkg \ -d wwwroot/lib/bootstrap \ --files dist/js/bootstrap.min.js \ --files dist/css/bootstrap.min.css 在 wwwRoot/index.html 添加對 bootstrap css 的引用: <script src="./lib/bootstrap/dist/js/bootstrap.min.js"></script> 現在將 wwwRoot/index.html 修改如下:

    November 10, 2020 Read
    Hero Image
    [SignalR] Websocket 即時聊天程式(二) - 後端 Token 授權

    SignalR驗證方式 SignalR 的授權可以選擇使用 Cookie 或 Bearer Token: Cookie: 驗證方法與一般網頁別無二致,較容易實作但缺點是只能用於瀏覽器(browser-specific)。 Bearer Token 可通用於網頁和 App (或提供任何應用程式),使用 Token 做登入能夠讓應用程式更容易實作其他使用者端,如果有其他的伺服器簽發 Token,更容易整合至單一登入(Single Sign-On),也是官方建議使用的方式,以下假設簽發 Token 與 SignalR 伺服器為同一台進行實作。 將 Token 驗證實作至伺服器之前,讓我們先練習實作一支簽發 Token 的 API。 以 Option pattern 取得 JWT 設定 這裡練習 Option pattern,以獲取 appsetting.json 當中 JWT 相關設定的強型別支援: appsetting.json 將 JWT 相關的設定寫到 appsetting.json 當中: { "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "JWT": { "Issuer": "Naxo", "Expires": "1440", // 憑證有效分鐘數 "SignKey": "myNameIsTigernaxo,ThisIsMyPersonalBlog" // 設定簽發/解密憑證的對稱式加密金鑰 }, "AllowedHosts": "*" }

    November 7, 2020 Read
    Hero Image
    [SignalR] Websocket 即時聊天程式(一) - 建立專案

    這個系列會官方文件為主,保留必要的部分,並視情況修改部份程式、添加說明文字。 建立 SignalR 專案 這個範例設定用靜態 html 做前端,這樣之後要做前後端分離也更容易一些,之後會用到 web api 請求登入 Token,所以起始一個 web api 專案: # 建立專案 dotnet new webapi -o SignalR # 以 VS Code 打開專案 code -r signalr 建立 SignalR 中樞 在.NET Core 3.1 當中使用 SignalR 伺服器端不再需要安裝額外的套件,直接將 SignalR 注入服務容器就能使用, SignalR 的 Hub 中文名稱就叫做中樞,在專案中新增資料夾 Hubs 用來專門存放 Hub 實作類別,並在 Hubs 中新增檔案 ChatHub.cs,內容如下: using Microsoft.AspNetCore.SignalR; using System.Threading.Tasks; namespace SignalR.Hubs { // 這就是所謂的 SignalR 中樞 public class ChatHub : Hub { // 這是提供 Client (js)端呼叫的方法,後面是這個方法接受的參數 public async Task SendMessage(string user, string message) { // 針對每個以連線的客戶端呼叫 ReceiceMassage 方法,並傳送參數 user、message await Clients.

    November 3, 2020 Read
    Navigation
    • About
    • Skills
    • Experiences
    • Education
    Contact me:
    • [email protected]
    • +886919681059

    Stay up to date with email notification


    By entering your email address, you agree to receive the newsletter of this website.

    Toha Theme Logo Toha
    © 2022 Copyright.
    Powered by Hugo Logo