2016-09-20 48 views
3

我正在編寫一個類似於web應用程序的儀表板。外部系統的狀態變化應通過SignalR下推至瀏覽器。外部系統將其更新發送到Azure Service Bus主題。我寫了一個Azure函數,這個函數將由其中一個主題觸發。該功能通過SignalR .Net客戶端庫連接到SignalR集線器,並將消息轉發到集線器。集線器然後將消息發送給瀏覽器。Azure函數如何對SignalR進行身份驗證?

現在這工作正常。下一步是爲SignalR集線器啓用身份驗證。網絡應用程序的其他部分需要驗證。用戶使用他的Azure AD憑據登錄。

問題是Azure函數如何對SignalR進行身份驗證?在Azure功能應用程序的應用程序設置中保存一些憑據是不行的。

我研究了SignalR的擴展技術的解決方法。我們可以將服務總線主題配置爲背板。每個SignalR集線器都會將該消息的副本發送到主題中,以便集線器的其他實例獲取該消息並將其推送到其連接的客戶端。這個想法是,Azure功能將狀態信息推入背板主題。但令人遺憾的是,SignalR使用未知編碼。所以這個解決方法是不可能的。

詳細信息以@ astaykov的回答

  1. 添加一個應用程序角色到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" 
        } 
    ], 
    
  2. 將Azure函數的應用程序的應用程序註冊到上述應用程序角色。確保Azure功能應用程序的註冊屬於Web應用程序/ API類型。
  3. 在Azure Function App的應用程序註冊中創建一個密鑰,並在獲取令牌時使用它。

    var ctx = new AuthenticationContext(tenant); 
    var cred = new ClientCredential(functionAppRegistrationId, key); 
    AuthenticationResult result = await ctx.AcquireTokenAsync(signalRRegistrationId, cred); 
    
  4. 在查詢字符串中使用該標記。在互聯網上搜索承載認證SignalR。
+0

大概看看持票人標記http://blog.marcinbudny.com/2014/05/authentication-with-signalr-and-oauth.html?m=1 – GraemeMiller

回答

5

你提出了兩個問題。所以我會分開癢他們。

問題是如何才能Azure功能驗證 SignalR?在Azure 功能應用程序的應用程序設置中保存一些憑據是不行的。

正如@GreameMiller已經提到的那樣,您應該考慮使用OAuth承載令牌對SignalR進行身份驗證。對於您的功能應用程序,您可以create a Service Principal in your Azure AD並使用它爲您的SignalR獲得有效的令牌(無論如何,它必須是另一個Application in Azure AD,或者與您的Web應用程序相同)。後者你可能已經完成了,你需要得到前者。

一個非常重要的事情 - 一旦在Azure AD中同時獲得"applications" (Service Principals),則必須通過在Azure AD中明確授予這些權限來確保「Function App Service Principal」可以訪問「SignalR Web App」門戶。再次從that article,你必須去你的「功能應用程序」應用程序的配置設置,並確保配置「權限其他應用程序」。如果您已正確配置您的WebApp(使用SignalR),您將在僅有選項的配置可用應用程序列表中看到該列表 - 訪問您的應用程序名稱。您必須使用Application Permissions而不是Delegated Permissions

其餘的工作是標準的OAuth2客戶端編程 - 客戶端Id +客戶端祕密。但是,是的,您必須將這些保存在您的功能應用程序的功能中。不知道你如何想象功能應用程序可以獲得沒有任何形式的憑證的令牌。

你的第二個部分

...的想法是,Azure的函數把狀態信息 在背板的話題。但令人遺憾的是,SignalR使用未知編碼。 所以這種解決方法是不可能的。

您正在使用ServiceBus作爲signalR的背板。但是,這樣做的目的是幫助同步橫向擴展部署中的所有signalR集線器(通常是雲所關注的),而不是讓客戶將消息推送到集線器。這些是僅由signalR集線器使用的系統消息,以確保每個人都知道一切。無論如何,當你開始雲計算時,你需要這架飛機。

+1

做他說的話:) – GraemeMiller

+1

@astaykov「不確定你如何想象Function App可以獲得一個沒有任何憑證的令牌。「 - 這是爲了不使用僅用於此目的的目錄中的(虛擬)用戶憑證。我應該更精確。我會研究服務的主要事情並回來。 – Yavuz