1

我真的很难理解如何实现这一点。我正在运行 Azure SignalR 服务。我有一个 Azure 函数设置。我有一个 Web API。

Web API 向 Azure 函数触发 HTTP POST,然后使用 HTTPTrigger 向连接到 Azure SignalR 服务的所有用户发送(广播)。伟大的!

现在我有一个问题,对于每个 HTTP POST,Web API 必须只向特定用户发送消息。显然,当用户使用 Azure SignalR 连接(或“协商”)时,他们需要以某种方式进行身份验证。

说实话,当我有一个自托管的 SignalR 应用程序时,我知道如何对用户进行身份验证。每当用户连接到 SignalR 集线器时,先使用不记名令牌身份验证完成此操作。但是,那是自托管的 SignalR。我现在使用托管在 Azure 上的 Azure SignalR。

另外我需要说的是,Azure SignalR 的客户端监听的 Negotatiate 和所有方法都是 Azure Functions。

[FunctionName("negotiate")]
    public static SignalRConnectionInfo Negotiate(
    [HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequest req,
    [SignalRConnectionInfo
        (HubName = "notifications")] //, UserId = "{headers.x-ms-client-principal-id}"
        SignalRConnectionInfo connectionInfo)
    {
        // connectionInfo contains an access key token with a name identifier claim set to the authenticated user
        return connectionInfo;
    }

    [FunctionName("PlacedOrderNotification")]
    public static async Task Placed(
    [QueueTrigger("new-order-notifications")] OrderPlacement orderPlacement,
    [SignalR(HubName = "notifications")] IAsyncCollector<SignalRMessage> signalRMessages,
    ILogger log)
        {
            log.LogInformation($"Sending notification for {orderPlacement.CustomerName}");

            await signalRMessages.AddAsync(
                new SignalRMessage
                {
                    Target = "productOrdered",
                    Arguments = new[] { orderPlacement }
                });
        }

我想以某种方式将我的不记名令牌身份验证并放置在 Azure SignalR 中。

现在是百万美元的问题……我到底该怎么做呢?我可以重新使用用于自托管 SignalR 服务的承载身份验证代码并以某种方式将其集成到我的架构中吗?

4

1 回答 1

1

正常的使用过程应该是下面描述的场景。

Web API 向 Azure 函数触发 HTTP POST,然后使用 HTTPTrigger 向连接到 Azure SignalR 服务的所有用户发送(广播)。伟大的!

根据您的描述,Web API 发送一个正文包含 json 数据的帖子,例如:

{
  "orderid": "0001",
  "status" : "created",
  "userid" : "Jason",
  ......
}

然后你function app需要处理这个订单信息,找出谁需要推送才能收到这个消息。

建议,你可以将signlar与function app集成。

根据业务信息和需求,将订单信息推送给指定用户。

1. SignalR - 检查用户是否仍然连接

2. 在 SignalR 中向特定用户发送消息

于 2020-11-13T08:04:20.910 回答