在 Azure Function 中使用 JWT 进行无服务器 SignalR 身份验证
Serverless SignalR authentication with JWT in Azure Function
我在 Azure 函数中使用 SignalRConnectionInfo
输入绑定。在此绑定中,我需要提供当前主体的 userId
,但默认情况下,Azure 函数仅支持使用应用服务身份验证中的 pre-defined headers,如 here,在下面的例子中:
[FunctionName("negotiate")]
public static SignalRConnectionInfo Negotiate(
[HttpTrigger(AuthorizationLevel.Anonymous)]HttpRequest req,
[SignalRConnectionInfo(HubName = "foo", UserId = "{headers.x-ms-client-principal-id}")] SignalRConnectionInfo connectionInfo)
{
return connectionInfo;
}
因为我没有使用 App Service 身份验证,也不想使用,所以这不适合我的需要。
我目前拥有的是一个 JWT,用户将其提供给我们在另一个应用服务中托管的 API,以便对请求进行身份验证并识别他们自己。我如何修改 SignalRConnectionInfo
绑定的 UserId
属性 以从该 JWT 中的声明中检索 UserId?
据我所知,没有办法使用绑定表达式从 JWT 中提取信息。
相反,您必须使用 Runtime Binding 首先从 JWT 中提取信息,然后在绑定中使用它来获取 SignalR 连接信息。
这是一个功能示例,其中 JWT 从 Authorization
header 中检索,经过验证,然后应用于 SignalRConnectionInfo
属性。
[FunctionName("Negotiate")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "negotiate")] HttpRequest req,
IBinder binder)
{
if (req.Headers.ContainsKey("Authorization"))
{
var principal = TryGetPrincipal(req.Headers["Authorization"].ToString());
if (principal != null)
{
var connectionInfo = await binder.BindAsync<SignalRConnectionInfo>(new SignalRConnectionInfoAttribute
{
HubName = _hubName,
UserId = principal.FindFirst(ClaimTypes.NameIdentifier).Value
});
return new OkObjectResult(connectionInfo);
}
}
return new UnauthorizedResult();
}
public ClaimsPrincipal TryGetPrincipal(string token) {
// implementation varies based on authorization type...
}
我在 Azure 函数中使用 SignalRConnectionInfo
输入绑定。在此绑定中,我需要提供当前主体的 userId
,但默认情况下,Azure 函数仅支持使用应用服务身份验证中的 pre-defined headers,如 here,在下面的例子中:
[FunctionName("negotiate")]
public static SignalRConnectionInfo Negotiate(
[HttpTrigger(AuthorizationLevel.Anonymous)]HttpRequest req,
[SignalRConnectionInfo(HubName = "foo", UserId = "{headers.x-ms-client-principal-id}")] SignalRConnectionInfo connectionInfo)
{
return connectionInfo;
}
因为我没有使用 App Service 身份验证,也不想使用,所以这不适合我的需要。
我目前拥有的是一个 JWT,用户将其提供给我们在另一个应用服务中托管的 API,以便对请求进行身份验证并识别他们自己。我如何修改 SignalRConnectionInfo
绑定的 UserId
属性 以从该 JWT 中的声明中检索 UserId?
据我所知,没有办法使用绑定表达式从 JWT 中提取信息。
相反,您必须使用 Runtime Binding 首先从 JWT 中提取信息,然后在绑定中使用它来获取 SignalR 连接信息。
这是一个功能示例,其中 JWT 从 Authorization
header 中检索,经过验证,然后应用于 SignalRConnectionInfo
属性。
[FunctionName("Negotiate")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "negotiate")] HttpRequest req,
IBinder binder)
{
if (req.Headers.ContainsKey("Authorization"))
{
var principal = TryGetPrincipal(req.Headers["Authorization"].ToString());
if (principal != null)
{
var connectionInfo = await binder.BindAsync<SignalRConnectionInfo>(new SignalRConnectionInfoAttribute
{
HubName = _hubName,
UserId = principal.FindFirst(ClaimTypes.NameIdentifier).Value
});
return new OkObjectResult(connectionInfo);
}
}
return new UnauthorizedResult();
}
public ClaimsPrincipal TryGetPrincipal(string token) {
// implementation varies based on authorization type...
}