1

尝试使用功能键(AuthorizationLevel.Function)保护我的天蓝色功能

我的天蓝色函数使用signalR。如果我在协商和其他 signalR 入口点上使用 AuthorizationLevel.Function,当 javascript 代码连接到 signalR: 函数时,如何传递函数键:

       public static SignalRConnectionInfo Negotiate(
       [HttpTrigger( AuthorizationLevel.Function, "post" )] HttpRequest req,
       [SignalRConnectionInfo( HubName = "myHub")] SignalRConnectionInfo connectionInfo,
       ILogger log )
       {
          return connectionInfo;
       }

网站:

        const connection = new signalR.HubConnectionBuilder()
             .withUrl('https://<myfunction>.azurewebsites.net')
             .configureLogging(signalR.LogLevel.Information)
             .build();

        connection.start()
            .catch(console.error);

似乎 HubConnectionBuilder 可以在 c# 中访问标头,但不能在 javascript 中访问。

我已阅读将标头添加到@aspnet/signalr Javascript 客户端 ,但第一个建议将密钥附加到 url,并且在连接时会将 /negotiate 附加到它,从而导致带有 https://host/&code=/negotiate 的 URL 无效。

如果不可能,建议有什么替代方法来保护我的 signalR 功能?(可能是不记名令牌,如https://docs.microsoft.com/en-us/aspnet/core/signalr/authn-and-authz?view=aspnetcore-3.1

谢谢

4

2 回答 2

0

如果您查看withUrl 方法的文档,它允许选项对象作为第二个参数:

function withUrl(url: string, options: IHttpConnectionOptions)

选项的类型是IHttpConnectionOptions,它提供了一些可能性:

a) 您可以提供IHttpConnectionOptions.accessTokenFactory的实现,它应该返回一个 Bearer 令牌(为此,您需要在 Azure Function 中手动验证 Bearer 令牌)

b)您可以提供自己的 HttpClient 实现,在其中您可以通过添加 Azure 功能键来修改 Post 请求,如下所示:

const connection = new signalR.HubConnectionBuilder()
  .withUrl('https://<myfunction>.azurewebsites.net', {
    httpClient: {
      post: (url, httpOptions) => {
        const headers = {
          ...httpOptions.headers,
          'x-functions-key': YOUR_AZURE_FUNCTION_KEY,
        }

        return axios.post(url, {}, { headers }).then((response) => {
          return (newResponse = {
            statusCode: response.status,
            statusText: response.statusText,
            content: JSON.stringify(response.data),
          })
        })
      },
    },
  })
  .configureLogging(signalR.LogLevel.Information)
  .build()

资料来源:

https://docs.microsoft.com/en-us/aspnet/core/signalr/javascript-client?view=aspnetcore-3.1

如何将自定义标头从 React JS 客户端传递到 SignalR 集线器?

于 2020-10-30T09:35:04.613 回答
0

正如对这个问题中链接的问题的回答中所述,您现在可以执行以下操作:

const connection = new signalR.HubConnectionBuilder()
  .withUrl('https://<myfunction>.azurewebsites.net', {
       headers: {'x-functions-key': YOUR_AZURE_FUNCTION_KEY}
   })
  .build();
于 2021-03-01T16:52:57.627 回答