Signalr Azure函数中使用JWT的无服务器信号器身份验证

Signalr Azure函数中使用JWT的无服务器信号器身份验证,signalr,azure-functions,Signalr,Azure Functions,我正在Azure函数中使用SignalRConnectionInfo输入绑定。在此绑定中,我需要提供当前主体的userId,但是默认情况下,Azure函数仅支持使用来自App Service Authentication的预定义头,如下例所述: [功能名称协商] 公共静态信号连接信息协商 [HttpTriggerAuthorizationLevel.Anonymous]HttpRequest请求, [SignalRConnectionInfoHubName=foo,UserId={headers

我正在Azure函数中使用SignalRConnectionInfo输入绑定。在此绑定中,我需要提供当前主体的userId,但是默认情况下,Azure函数仅支持使用来自App Service Authentication的预定义头,如下例所述:

[功能名称协商] 公共静态信号连接信息协商 [HttpTriggerAuthorizationLevel.Anonymous]HttpRequest请求, [SignalRConnectionInfoHubName=foo,UserId={headers.x-ms-client-principal-id}]SignalRConnectionInfo connectionInfo { 返回connectionInfo; } 由于我没有使用应用程序服务身份验证,也不希望使用,因此这不适合我的需要


我目前拥有的是一个JWT,用户提供给我们在另一个应用程序服务中托管的API,以验证请求并识别自己。如何修改SignalRConnectionInfo绑定的UserId属性以从该JWT中的声明中检索UserId?

AFAIK无法使用绑定表达式从JWT中提取信息

相反,您必须首先使用从JWT提取信息,然后在绑定中使用它来获取信号器连接信息

下面是一个功能示例,其中JWT从授权标头中检索、验证,然后应用于SignalRConnectionInfo属性

[功能名称协商] 公共静态异步任务运行 [HttpTriggerAuthorizationLevel.Anonymous,post,Route=negotiate]HttpRequest请求, 伊宾德粘合剂 { if req.Headers.ContainsKeyAuthorization { var principal=TryGetPrincipalreq.Headers[Authorization].ToString; 如果主体!=null { var connectionInfo=await binder.BindAsyncnew SignalConnectionInfoAttribute { HubName=_HubName, UserId=principal.FindFirstClaimTypes.NameIdentifier.Value }; 返回新的OkObjectResultconnectionInfo; } } 返回新的未授权结果; } 公共索赔SPRINCIPAL TryGetPrincipalstring令牌{ //实现因授权类型而异。。。 }
恐怕没有一种方法可以使用绑定表达式从JWT中提取信息

相反,您必须首先使用从JWT提取信息,然后在绑定中使用它来获取信号器连接信息

下面是一个功能示例,其中JWT从授权标头中检索、验证,然后应用于SignalRConnectionInfo属性

[功能名称协商] 公共静态异步任务运行 [HttpTriggerAuthorizationLevel.Anonymous,post,Route=negotiate]HttpRequest请求, 伊宾德粘合剂 { if req.Headers.ContainsKeyAuthorization { var principal=TryGetPrincipalreq.Headers[Authorization].ToString; 如果主体!=null { var connectionInfo=await binder.BindAsyncnew SignalConnectionInfoAttribute { HubName=_HubName, UserId=principal.FindFirstClaimTypes.NameIdentifier.Value }; 返回新的OkObjectResultconnectionInfo; } } 返回新的未授权结果; } 公共索赔SPRINCIPAL TryGetPrincipalstring令牌{ //实现因授权类型而异。。。 }
谢谢,这很有效。你介意我编辑你的答案,把功能代码包括在内,以帮助未来的访问者吗?当然。没问题。谢谢谢谢,这很有效。你介意我编辑你的答案,把功能代码包括在内,以帮助未来的访问者吗?当然。没问题。谢谢