gpt4 book ai didi

azure - Azure Function 如何针对 SignalR 进行身份验证?

转载 作者:行者123 更新时间:2023-12-05 00:17:39 25 4
gpt4 key购买 nike

我正在编写一个类似 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 的应用注册中创建 key ,并在获取 token 时使用它。

    var ctx = new AuthenticationContext(tenant);
    var cred = new ClientCredential(functionAppRegistrationId, key);
    AuthenticationResult result = await ctx.AcquireTokenAsync(signalRRegistrationId, cred);
  4. 在查询字符串中使用标记。在互联网上搜索承载身份验证 SignalR。

最佳答案

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

The question is how can the Azure function authenticate against SignalR? Saving some credentials in the app settings of the Azure Function App is a no go.

正如 @GreameMiller 已经提到的,您应该考虑使用 OAuth Bearer Token 来验证 SignalR。对于您的 Azure Function App,您可以 create a Service Principal in your Azure AD并使用它来获取您的 SignalR 的有效 token (它必须是另一个 Application in Azure AD ,或者与您的网络应用程序相同)。后者您可能已经完成,您将需要获得前者。

一件非常重要的事情 - 一旦你同时获得 "applications" (Service Principals)在 Azure AD 中,您必须通过在 Azure AD 门户中明确授予这些权限来确保“函数应用服务主体”有权访问“SignalR Web 应用程序”。再次来自 that article ,您必须进入“功能应用”应用程序的配置设置,并确保配置“其他应用程序的权限”。如果您已正确配置您的 Web 应用程序(使用 SignalR),您将在可用于配置的应用程序列表中看到该应用程序,并且只有一个选项 - 访问您的应用程序名称。您必须使用应用程序权限,而不能委派权限

其余工作是标准 OAuth2 客户端编程 - 客户端 ID + 客户端密码。但是,是的,您必须将它们保留在 Function App 的函数中。不确定您如何想象 Function App 如何在没有任何凭证的情况下获得 token 。

你的第二部分

... The idea was that the Azure function pushes the status information into the backplane topic. But sadly SignalR uses an unknown encoding. So this workaround is not possible.

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

关于azure - Azure Function 如何针对 SignalR 进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39599924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com