首页 文章

Azure功能如何针对SignalR进行身份验证?

提问于
浏览
4

我正在编写一个类似Web应用程序的仪表板 . 外部系统的状态变化应通过SignalR下推到浏览器 . 外部系统将其更新发送到Azure Service Bus主题 . 我编写了一个Azure功能,它将由其中一个主题触发 . 该功能通过SignalR .Net客户端库连接到SignalR集线器,并将消息转发到集线器 . 然后,集线器将消息发送到浏览器 .

现在这很好用 . 下一步是启用SignalR集线器的身份验证 . Web应用程序的其他部分需要身份验证 . 用户使用其Azure AD凭据登录 .

问题是Azure功能如何针对SignalR进行身份验证?在Azure功能应用程序的应用程序设置中保存一些凭据是不行的 .

我已经研究了SignalR的扩展技术的解决方法 . 我们可以将服务总线主题配置为背板 . 每个SignalR集线器都会将消息的副本发送到主题中,以便集线器的其他实例获取消息并将其下推到其连接的客户端 . 想法是Azure功能将状态信息推送到背板主题 . 但遗憾的是SignalR使用未知编码 . 所以这种解决方法是不可能的 .

Details to @astaykov's answer

  • 在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功能应用程序's app registration with the above app role. Make sure the 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);
  • 在查询字符串中使用令牌 . 在互联网上搜索承载认证SignalR .

1 回答

  • 6

    你提出两个问题 . 所以我会单独发痒 .

    问题是Azure功能如何针对SignalR进行身份验证?在Azure功能应用程序的应用程序设置中保存一些凭据是不行的 .

    正如@GreameMiller已经提到的那样,你应该看看使用OAuth Bearer Token验证SignalR . 对于您的功能应用程序,您可以create a Service Principal in your Azure AD并使用它来获取SignalR的有效令牌(无论如何必须是另一个Application in Azure AD,或与您的网络应用程序相同) . 后者你可能已经完成了,你需要得到前者 .

    一个非常重要的事情 - 一旦在Azure AD中同时获得"applications" (Service Principals),就必须通过在Azure AD门户中明确授予这些权限来确保"Function App Service Principal"可以访问"SignalR Web App" . 再次从that article,您必须转到"Function App"应用程序的配置设置,并确保配置"Permissions to other applications" . 如果您已正确配置WebApp(使用SignalR),您将在可用的配置应用程序列表中看到该选项,只有选项 - 应用程序的访问名称 . 你必须使用 Application Permissionsnot Delegated Permissions .

    其余的工作是标准的OAuth2客户端编程 - 客户端Id客户端密钥 . 但是,是的,您必须将这些保留在功能应用程序的功能中 . 不确定您如何想象功能应用程序可以获得没有任何凭据的令牌 .

    你的第二部分

    ...想法是Azure功能将状态信息推送到背板主题 . 但遗憾的是SignalR使用未知编码 . 所以这种解决方法是不可能的 .

    使用ServiceBus作为signalR的背板,您正走在正确的道路上 . 但是,这是设计用于帮助在横向扩展部署(通常是 Cloud 的所有内容)上同步所有signalR集线器,而不是让客户将消息推送到集线器 . 这些是仅由signalR集线器使用的系统消息,以确保每个人都知道一切 . 当走向 Cloud 端并且规模扩大时 - 无论如何你都需要背板 .

相关问题