【发布时间】:2017-01-28 17:20:20
【问题描述】:
我正在编写一个类似 Web 应用程序的仪表板。外部系统的状态变化应该通过 SignalR 下推到浏览器。外部系统将其更新发送到 Azure 服务总线主题。我编写了一个 Azure 函数,它将由其中一个主题触发。该函数通过 SignalR .Net 客户端库连接到 SignalR 集线器,并将消息转发到集线器。然后集线器将消息发送到浏览器。
现在这工作正常。下一步是为 SignalR 集线器启用身份验证。 Web 应用程序的其他部分需要身份验证。用户使用其 Azure AD 凭据登录。
问题是 Azure 函数如何针对 SignalR 进行身份验证?在 Azure Function App 的应用设置中保存一些凭据是不行的。
我研究了一种使用 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 Function App 的应用注册与上述应用角色相关联。确保 Azure Function App 的注册类型为 Web 应用/API。
-
在 Azure Function App 的应用注册中创建一个密钥,并在获取令牌时使用。
var ctx = new AuthenticationContext(tenant); var cred = new ClientCredential(functionAppRegistrationId, key); AuthenticationResult result = await ctx.AcquireTokenAsync(signalRRegistrationId, cred); - 在查询字符串中使用标记。在 Internet 上搜索 Bearer Authentication SignalR。
【问题讨论】:
-
大概看Bearer tokenblog.marcinbudny.com/2014/05/…
标签: azure authentication signalr azure-functions