【问题标题】:How can Azure Function authenticate against SignalR?Azure Function 如何针对 SignalR 进行身份验证?
【发布时间】: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 的回答详情

  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 Function App 的应用注册与上述应用角色相关联。确保 Azure Function App 的注册类型为 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. 在查询字符串中使用标记。在 Internet 上搜索 Bearer Authentication SignalR。

【问题讨论】:

标签: azure authentication signalr azure-functions


【解决方案1】:

你提出了两个问题。所以我将分别处理它们。

问题是 Azure 函数如何进行身份验证 信号机?在 Azure 的应用设置中保存一些凭据 Function App 是不行的。

正如@GreameMiller 已经提到的,您应该查看使用 OAuth Bearer Token 对 SignalR 进行身份验证。对于您的 Azure 函数应用程序,您可以 create a Service Principal in your Azure AD 并使用它为您的 SignalR 获取有效令牌(无论如何它必须是另一个 Application in Azure AD,或与您的 Web 应用程序相同)。后者您可能已经完成,您将需要获得前者。

一件非常重要的事情 - 一旦您在 Azure AD 中同时获得 "applications" (Service Principals),您必须通过在 Azure 中明确授予这些权限来确保“Function App Service Principal”可以访问“SignalR Web App”广告门户。同样来自that article,您必须转到“功能应用程序”应用程序的配置设置,并确保配置“对其他应用程序的权限”。如果您已经正确配置了您的 WebApp(使用 SignalR),您将在可用的应用程序列表中看到它只有一个选项 - 访问 您的应用程序的名称。您必须使用 Application Permissionsnot Delegated Permissions

剩下的工作是标准的 OAuth2 客户端编程 - 客户端 ID + 客户端密码。但是,是的,您必须将它们保留在 Function App 的功能中。不确定您如何想象 Function App 可以在没有任何凭据的情况下获取令牌。

你的第二部分

... 这个想法是 Azure 函数推送状态信息 进入背板话题。但遗憾的是 SignalR 使用了未知的编码。 所以这种解决方法是不可能的。

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

【讨论】:

  • 照他说的做:)
  • @astaykov “不知道你如何想象 Function App 可以在没有任何凭据的情况下获取令牌。” - 仅出于此目的不使用位于目录中的(虚拟)用户的凭据。我应该更精确。我会调查一下服务主体的事情然后回来。
猜你喜欢
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-03
  • 1970-01-01
相关资源
最近更新 更多