Поделиться через


Входная привязка службы 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.

В следующем примере показана функция 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}

Следующие шаги