我正在編寫一個類似於web應用程序的儀表板。外部系統的狀態變化應通過SignalR下推至瀏覽器。外部系統將其更新發送到Azure Service Bus主題。我寫了一個Azure函數,這個函數將由其中一個主題觸發。該功能通過SignalR .Net客戶端庫連接到SignalR集線器,並將消息轉發到集線器。集線器然後將消息發送給瀏覽器。Azure函數如何對SignalR進行身份驗證?
現在這工作正常。下一步是爲SignalR集線器啓用身份驗證。網絡應用程序的其他部分需要驗證。用戶使用他的Azure AD憑據登錄。
問題是Azure函數如何對SignalR進行身份驗證?在Azure功能應用程序的應用程序設置中保存一些憑據是不行的。
我研究了SignalR的擴展技術的解決方法。我們可以將服務總線主題配置爲背板。每個SignalR集線器都會將該消息的副本發送到主題中,以便集線器的其他實例獲取該消息並將其推送到其連接的客戶端。這個想法是,Azure功能將狀態信息推入背板主題。但令人遺憾的是,SignalR使用未知編碼。所以這個解決方法是不可能的。
詳細信息以@ astaykov的回答
添加一個應用程序角色到SignalR的應用註冊。
"appRoles": [ { "allowedMemberTypes": [ "Application" ], "displayName": "Access SignalR Backend", "id": "239de039-e2c5-445c-8454-ccdc51888b94", "isEnabled": true, "description": "Allow the application to access SignalR Backend.", "value": "access" } ],
- 將Azure函數的應用程序的應用程序註冊到上述應用程序角色。確保Azure功能應用程序的註冊屬於Web應用程序/ API類型。
在Azure Function App的應用程序註冊中創建一個密鑰,並在獲取令牌時使用它。
var ctx = new AuthenticationContext(tenant); var cred = new ClientCredential(functionAppRegistrationId, key); AuthenticationResult result = await ctx.AcquireTokenAsync(signalRRegistrationId, cred);
- 在查詢字符串中使用該標記。在互聯網上搜索承載認證SignalR。
大概看看持票人標記http://blog.marcinbudny.com/2014/05/authentication-with-signalr-and-oauth.html?m=1 – GraemeMiller