日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于事件驱动架构构建微服务第19部分:使用 SignalR 和 Azure Active Directory 构建和保护实时通信...

發布時間:2023/12/4 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于事件驱动架构构建微服务第19部分:使用 SignalR 和 Azure Active Directory 构建和保护实时通信... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文鏈接:https://logcorner.com/building-micro-services-through-event-driven-architecture-part19-building-and-securing-real-time-communications-using-signalr-and-azure-active-directory/

命令 HTTP API 將事件存儲到事件存儲,但不直接將它們發布到 Kafka 服務總線。可以考慮這種情況,但我不希望命令 API 也充當生產者。

另一個原因是前端SPA應該收到推送通知。應該通知它發布的命令已成功。

所以我需要一個像SignalR這樣的通知系統。

使用場景如下:

  • 前端 SPA 啟動并訂閱 SignalR 組(主題)

  • 前端 SPA 將數據發布到命令 HTTP API

  • 命令 HTTP API 將從post/put/delete請求中接收的數據轉換為事件,并將這些事件存儲到事件存儲中

  • 命令 HTTP API 將通知推送到 SignalR 組(主題)

  • 訂閱 SignalR 組的生產者服務接收通知,然后將事件發布到 Kafka 服務總線

  • 訂閱 Kafka 服務總線的使用者從 Kafka 服務總線接收事件,然后構建一個讀取模型并將其存儲到非 SQL 數據庫(Elasticsearch)并向 SignalR 組發送通知

  • 前端 SPA 會收到 Elasticsearch 索引已更新的通知,然后刷新視圖。

因此,推送通知系統在此體系結構中起著至關重要的作用。

如果架構的某個部分出現故障(SignalR Hub、Kafka、database、API)會發生什么?我們將在以后的教程中看到它。

在本教程中,我將演示如何構建 SignalR Hub 通知系統,并使用標識提供者通過使用 Azure AD B2C 啟用 Oauth2 和 OpenID Connect 來保護 SignalR Hub 通知系統。

Azure Active Directory B2C 提供企業到客戶的標識即服務。客戶使用其首選的社交、企業或本地帳戶標識來獲取對應用程序和 API 的單一登錄訪問權限。

有關 Azure AD B2C 的更多信息,請參閱什么是 Azure Active Directory B2C?

Azure Active Directory B2C

若要將 Azure AD B2C 設置為標識提供者,我需要創建一個與 Azure AD 租戶不同的 B2C 租戶。

Azure AD B2C 是獨立于 Azure Active Directory (Azure AD) 的服務。它基于與 Azure AD 相同的技術構建,但用途不同 - 允許企業構建面向客戶的應用程序,然后允許任何人注冊這些應用程序,而對用戶帳戶沒有限制。

有關 Azure AD 的更多信息,請參閱什么是 Azure Active Directory?

構建 SignalR Hub 通知

ASP.NET Core SignalR 是一個開源庫,可簡化向應用程序添加實時Web功能的過程。實時 Web 功能使服務器端代碼能夠立即將內容推送到客戶端。

https://docs.microsoft.com/en-us/aspnet/core/signalr/introduction?WT.mc_id=DOP-MVP-5003013

要構建 SignalR Hub ,您應該定義一個從 Hub 繼承的類,如下所示:

using?Microsoft.AspNetCore.SignalR;namespace?SignalRChat.Hubs {public?class?ChatHub?:?Hub{public?async?Task?SendMessage(string?user,?string?message){await?Clients.All.SendAsync(“ReceiveMessage”,?user,?message);}} }

要向所有連接的客戶端發送消息,您應該使用SendMessage功能并接收消息,連接的客戶端應偵聽接收消息

您可以使用以下鏈接開始使用 SignalR:https://docs.microsoft.com/en-us/aspnet/core/tutorials/signalr?view=aspnetcore-6.0&tabs=visual-studio

SendMessage和ReisterMessage作為字符串使用和調用,所以我不會以相同的方式繼續,而是使用強類型的方式

所以我創建了一個IHubInvoker接口來調用Hub:

  • 發布 :將 T 類型的消息發布到中心

  • 發布到主題 :將特定主題的 T 類型消息發布到中心

  • 訂閱 :訂閱主題

  • 取消訂閱 :取消訂閱主題

我創建了一個 IHubNotifier 接口來偵聽來自集線器的消息。

SignalR Hub 應該繼承自 Hub<IHubNotifier>、IHubInvoker

在 startup.cs ( configure 方法) 類將 endpoints 與連接相關聯。

我創建了一個 ISignalRPublisher 接口來訂閱主題或將消息發布到中心。

所以要訂閱一個主題,我應該調用 nameof(IHubInvoker.Subscribe) ,要發布一個主題,我應該調用nameof(IHubInvoker.PublishToTopic)

我創建了一個 ISignalRNotifier 接口來開始客戶端連接,停止連接并收聽消息

因此,為了偵聽和處理發送到中心的消息,我注冊了一個處理程序,當調用具有指定方法名稱的中心方法時,將調用該處理程序:nameof(IHubNotifier.OnPublish)

ISignalRNotifier 應按如下方式使用

public?interface?ISignalRNotifier {event?Action<string,?object>?ReceivedOnPublishToTopic;Task?StartAsync();Task?OnPublish();Task?OnPublish(string?topic);Task?StopAsync(); }

要將消息發布到 hub,我應該使用 ISignalRPublisher 接口。如果斷開連接的客戶端嘗試向中心發送消息,在發送消息之前會自動連接它

保護 SignalR HUB

若要保護SignalR HUB,需要在 Azure AD B2C 租戶中注冊應用程序,公開終結點

Azure AD B2C 應用程序注冊

轉到租戶并單擊"應用注冊"并相應地填寫表單:提供應用程序名稱、支持的帳戶類型。在這里,我不需要重定向URI,因為它是一個Web api。

單擊"公開 API"并設置應用程序 ID URI(在本例中為,https://workshopb2clogcorner.onmicrosoft.com/signalr/hub)

配置 SignalR HUB

打開 startup.cs 類并添加以下內容以注冊身份驗證服務所需的服務,并使用 Microsoft 標識平臺保護hub

打開appsettings.Development.json 并添加如下內容

將 [ClientID] 替換為您注冊的應用程序的標識符,將 [TenantName] 替換為您的租戶名稱(在我的案例 workshopb2clogcorner 中)。

用戶流B2C_1_SignUpIn、B2C_1_PasswordReset和B2C_1_ProfileEdit已在第16部分中配置:https://logcorner.com/building-micro-services-through-event-driven-architecture-part16-azure-active-directory-b2c/

要啟用身份驗證,請使用標志"isAuthenticationEnabled":在 appSettings.json 文件中為 true。

要禁用身份驗證,請使用標志"isAuthenticationEnabled":在 appSettings.json 文件中為 false。

在 startup.cs 類中,它的管理方式如下:

bool.TryParse(Configuration[“isAuthenticationEnabled”],?out?var?isAuthenticationEnabled); if?(!isAuthenticationEnabled) {endpoints.MapHub<LogCornerHub<object>>(“/logcornerhub”); } else {endpoints.MapHub<LogCornerHub<object>>(“/logcornerhub”).RequireAuthorization(); }

測試

運行應用程序并導航到 http://localhost:5000/logcornerhub 或者 https://localhost:5001/logcornerhub

http://localhost:5000/logcornerhub

https://localhost:5001/logcornerhub

可以看到,hub 已準備好進行客戶端連接

代碼源可在此處獲得:

https://github.com/logcorner/LogCorner.EduSync.Notification.Server/tree/develop

總結

以上是生活随笔為你收集整理的基于事件驱动架构构建微服务第19部分:使用 SignalR 和 Azure Active Directory 构建和保护实时通信...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。