Входная привязка службы SignalR для службы "Функции Azure"
Прежде чем клиент сможет подключиться к службе Azure SignalR, необходимо получить URL-адрес конечной точки службы и действительный маркер доступа. Входная привязка SignalRConnectionInfo создает URL-адрес конечной точки службы SignalR и допустимый маркер, которые используются для подключения к службе. Маркер ограничен временем и может использоваться для проверки подлинности конкретного пользователя в подключении. Таким образом, не следует кэшировать маркер или совместно использовать его между клиентами. Обычно для получения сведений о подключении клиенты используют SignalRConnectionInfo с триггером HTTP.
Дополнительные сведения об использовании этой привязки для создания функции "согласование", совместимой с клиентским пакетом SDK SignalR, см. в Функции Azure разработке и настройке с Служба Azure SignalR. Сведения об установке и настройке см. в обзорной статье.
Пример
Функцию C# можно создать с помощью одного из следующих режимов C#:
- Изолированная рабочая модель: скомпилированная функция C#, которая выполняется в рабочем процессе, изолированном от среды выполнения. Изолированный рабочий процесс необходим для поддержки функций C#, работающих в LTS и не LTS-версиях .NET и платформа .NET Framework.
- Модель внутрипроцессного процесса: скомпилированная функция C#, которая выполняется в том же процессе, что и среда выполнения Функций.
- Скрипт C#: используется в основном при создании функций C# в портал Azure.
Внимание
Поддержка будет завершена для модели в процессе 10 ноября 2026 г. Настоятельно рекомендуется перенести приложения в изолированную рабочую модель для полной поддержки.
В следующем примере показана функция C#, получающая сведения о подключении SignalR с помощью входной привязки и возвращающая их по протоколу HTTP.
[Function(nameof(Negotiate))]
public static string Negotiate([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequestData req,
[SignalRConnectionInfoInput(HubName = "serverless")] string connectionInfo)
{
// The serialization of the connection info object is done by the framework. It should be camel case. The SignalR client respects the camel case response only.
return connectionInfo;
}
В следующем примере показана входная привязка для сведений о подключении SignalR в файле function.json и функция, использующая привязку для возврата сведений о подключении.
Данные привязки для примера в файле function.json:
{
"type": "signalRConnectionInfo",
"name": "connectionInfo",
"hubName": "hubName1",
"connectionStringSetting": "<name of setting containing SignalR Service connection string>",
"direction": "in"
}
Ниже показан код JavaScript.
const { app, input } = require('@azure/functions');
const inputSignalR = input.generic({
type: 'signalRConnectionInfo',
name: 'connectionInfo',
hubName: 'hubName1',
connectionStringSetting: 'AzureSignalRConnectionString',
});
app.post('negotiate', {
authLevel: 'function',
handler: (request, context) => {
return { body: JSON.stringify(context.extraInputs.get(inputSignalR)) }
},
route: 'negotiate',
extraInputs: [inputSignalR],
});
Скоро должны появиться полные примеры PowerShell.
В следующем примере показана входная привязка для сведений о подключении SignalR в файле function.json и функция Python, использующая привязку для возврата сведений о подключении.
Ниже приведен код Python.
def main(req: func.HttpRequest, connectionInfoJson: str) -> func.HttpResponse:
return func.HttpResponse(
connectionInfoJson,
status_code=200,
headers={
'Content-type': 'application/json'
}
)
В следующем примере показана функция Java, получающая сведения о подключении SignalR с помощью входной привязки и возвращающая их по протоколу HTTP.
@FunctionName("negotiate")
public SignalRConnectionInfo negotiate(
@HttpTrigger(
name = "req",
methods = { HttpMethod.POST },
authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> req,
@SignalRConnectionInfoInput(
name = "connectionInfo",
HubName = "hubName1") SignalRConnectionInfo connectionInfo) {
return connectionInfo;
}
Использование
Прошедшие проверку подлинности маркеры
Когда клиент, прошедший проверку подлинности, активирует функцию, можно добавить утверждение идентификатора пользователя в созданный маркер. Вы можете легко добавить аутентификацию к приложению-функции с помощью аутентификации Службы приложений.
Проверка подлинности службы приложений задает заголовки HTTP x-ms-client-principal-id
и x-ms-client-principal-name
, содержащие имя и идентификатор субъекта клиента прошедшего проверку подлинности пользователя соответственно.
В качестве значения свойства UserId
привязки можно задать один из заголовков с помощью выражения привязки: {headers.x-ms-client-principal-id}
или {headers.x-ms-client-principal-name}
.
[Function("Negotiate")]
public static string Negotiate([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequestData req,
[SignalRConnectionInfoInput(HubName = "hubName1", UserId = "{headers.x-ms-client-principal-id}")] string connectionInfo)
{
// The serialization of the connection info object is done by the framework. It should be camel case. The SignalR client respects the camel case response only.
return connectionInfo;
}
@FunctionName("negotiate")
public SignalRConnectionInfo negotiate(
@HttpTrigger(
name = "req",
methods = { HttpMethod.POST, HttpMethod.GET },
authLevel = AuthorizationLevel.ANONYMOUS)
HttpRequestMessage<Optional<String>> req,
@SignalRConnectionInfoInput(name = "connectionInfo", hubName = "hubName1", userId = "{headers.x-ms-signalr-userid}") SignalRConnectionInfo connectionInfo) {
return connectionInfo;
}
Данные привязки в файле function.json:
{
"type": "signalRConnectionInfo",
"name": "connectionInfo",
"hubName": "hubName1",
"userId": "{headers.x-ms-client-principal-id}",
"connectionStringSetting": "<name of setting containing SignalR Service connection string>",
"direction": "in"
}
Ниже показан код JavaScript.
const { app, input } = require('@azure/functions');
const inputSignalR = input.generic({
type: 'signalRConnectionInfo',
name: 'connectionInfo',
hubName: 'hubName1',
connectionStringSetting: 'AzureSignalRConnectionString',
userId: '{headers.x-ms-client-principal-id}',
});
app.post('negotiate', {
authLevel: 'function',
handler: (request, context) => {
return { body: JSON.stringify(context.extraInputs.get(inputSignalR)) }
},
route: 'negotiate',
extraInputs: [inputSignalR],
});
Скоро должны появиться полные примеры PowerShell.
Ниже приведен код Python.
def main(req: func.HttpRequest, connectionInfo: str) -> func.HttpResponse:
# connectionInfo contains an access key token with a name identifier
# claim set to the authenticated user
return func.HttpResponse(
connectionInfo,
status_code=200,
headers={
'Content-type': 'application/json'
}
)
@FunctionName("negotiate")
public SignalRConnectionInfo negotiate(
@HttpTrigger(
name = "req",
methods = { HttpMethod.POST },
authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> req,
@SignalRConnectionInfoInput(
name = "connectionInfo",
HubName = "hubName1",
userId = "{headers.x-ms-client-principal-id}") SignalRConnectionInfo connectionInfo) {
return connectionInfo;
}
Атрибуты
Библиотеки C# в процессе и изолированном рабочем процессе используют атрибут для определения функции. Вместо этого в скрипте C# используется файл конфигурации function.json.
В следующей таблице описываются свойства атрибута SignalRConnectionInfoInput
.
Свойство атрибута | Description |
---|---|
HubName | Обязательный. Имя концентратора. |
ConnectionStringSetting | Имя параметра приложения, который содержит строку подключения службы SignalR (по умолчанию используется AzureSignalRConnectionString ). |
UserId | Необязательно. Идентификатор пользователя подключения SignalR. Выражение привязки можно использовать для привязки значения к заголовку или запросу HTTP-запроса. |
IdToken | Необязательно. Токен JWT, утверждения которого будут добавлены в утверждения пользователя. Его следует использовать вместе с ClaimTypeList. Выражение привязки можно использовать для привязки значения к заголовку или запросу HTTP-запроса. |
ClaimTypeList | Необязательно. Список типов утверждений, которые фильтруют утверждения в IdToken . |
Заметки
В следующей таблице описаны поддерживаемые параметры заметки SignalRConnectionInfoInput
.
Параметр | Description |
---|---|
name | Имя переменной, используемой в коде функции для объекта сведений о подключении. |
hubName | Обязательный. Имя концентратора. |
connectionStringSetting | Имя параметра приложения, который содержит строку подключения службы SignalR (по умолчанию используется AzureSignalRConnectionString ). |
userId | Необязательно. Идентификатор пользователя подключения SignalR. Выражение привязки можно использовать для привязки значения к заголовку или запросу HTTP-запроса. |
idToken | Необязательно. Токен JWT, утверждения которого будут добавлены в утверждения пользователя. Его следует использовать вместе с claimTypeList. Выражение привязки можно использовать для привязки значения к заголовку или запросу HTTP-запроса. |
claimTypeList | Необязательно. Список типов утверждений, которые фильтруют утверждения в idToken . |
Заметки
В следующей таблице описаны поддерживаемые параметры заметки SignalRConnectionInfoInput
.
Параметр | Description |
---|---|
name | Имя переменной, используемой в коде функции для объекта сведений о подключении. |
hubName | Обязательный. Имя концентратора. |
connectionStringSetting | Имя параметра приложения, который содержит строку подключения службы SignalR (по умолчанию используется AzureSignalRConnectionString ). |
userId | Необязательно. Идентификатор пользователя подключения SignalR. Выражение привязки можно использовать для привязки значения к заголовку или запросу HTTP-запроса. |
idToken | Необязательно. Токен JWT, утверждения которого будут добавлены в утверждения пользователя. Его следует использовать вместе с claimTypeList. Выражение привязки можно использовать для привязки значения к заголовку или запросу HTTP-запроса. |
claimTypeList | Необязательно. Список типов утверждений, которые фильтруют утверждения в idToken . |
Настройка
В следующей таблице описываются свойства конфигурации привязки, которые задаются в файле function.json.
Свойство в function.json | Описание |
---|---|
type | Должен иметь значениеsignalRConnectionInfo . |
direction | Должен иметь значениеin . |
hubName | Обязательный. Имя концентратора. |
connectionStringSetting | Имя параметра приложения, который содержит строку подключения службы SignalR (по умолчанию используется AzureSignalRConnectionString ). |
userId | Необязательно. Идентификатор пользователя подключения SignalR. Выражение привязки можно использовать для привязки значения к заголовку или запросу HTTP-запроса. |
idToken | Необязательно. Токен JWT, утверждения которого будут добавлены в утверждения пользователя. Его следует использовать вместе с claimTypeList. Выражение привязки можно использовать для привязки значения к заголовку или запросу HTTP-запроса. |
claimTypeList | Необязательно. Список типов утверждений, которые фильтруют утверждения в idToken . |
Выражения привязки для триггера HTTP
Это распространенный сценарий, когда значения некоторых атрибутов входной привязки SignalR приходят из HTTP-запросов. Поэтому мы покажем, как привязать значения из HTTP-запросов к атрибутам входной привязки SignalR через выражение привязки.
Тип метаданных HTTP | Формат выражения привязки | Description | Пример |
---|---|---|---|
ЗАПРОС HTTP-запроса | {query.QUERY_PARAMETER_NAME} |
Привязывает значение соответствующего параметра запроса к атрибуту | {query.userName} |
Заголовок HTTP-запроса | {headers.HEADER_NAME} |
Привязывает значение заголовка к атрибуту | {headers.token} |