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


Входная привязка службы SignalR для службы "Функции Azure"

Прежде чем клиент сможет подключиться к службе Azure SignalR, необходимо получить URL-адрес конечной точки службы и действительный маркер доступа. Входная привязка SignalRConnectionInfo создает URL-адрес конечной точки службы SignalR и допустимый маркер, которые используются для подключения к службе. Маркер ограничен временем и может использоваться для проверки подлинности конкретного пользователя в подключении. Таким образом, не следует кэшировать маркер или совместно использовать его между клиентами. Обычно для получения сведений о подключении клиенты используют SignalRConnectionInfo с триггером HTTP.

Дополнительные сведения об использовании этой привязки для создания функции "согласование", совместимой с клиентским пакетом SDK SignalR, см. в Функции Azure разработке и настройке с Служба Azure SignalR.

Если не явно объявлено, предположим, что примеры используют значение AzureSignalRConnectionStringпараметра подключения по умолчанию. Сведения об установке и настройке см. в обзорной статье.

Пример

Функцию 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;
}

Атрибуты

Библиотеки 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 см. в следующих статьях:

Использование

Подключения на основе управляемых удостоверений

Для оптимальной безопасности приложение-функция должна использовать управляемые идентификаторы при подключении к службе Azure SignalR вместо использования строка подключения, содержащего общий секретный ключ. Дополнительные сведения см. в статье "Авторизация запросов на Служба Azure SignalR ресурсов с помощью управляемых удостоверений Microsoft Entra".

Прошедшие проверку подлинности маркеры

Когда клиент, прошедший проверку подлинности, активирует функцию, можно добавить утверждение идентификатора пользователя в созданный маркер. Вы можете легко добавить аутентификацию к приложению-функции с помощью аутентификации Службы приложений.

Проверка подлинности службы приложений задает заголовки 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;
}

Выражения привязки для триггера HTTP

Это распространенный сценарий, когда значения некоторых атрибутов входной привязки SignalR приходят из HTTP-запросов. Поэтому мы покажем, как привязать значения из HTTP-запросов к атрибутам входной привязки SignalR через выражение привязки.

Тип метаданных HTTP Формат выражения привязки Description Пример
ЗАПРОС HTTP-запроса {query.QUERY_PARAMETER_NAME} Привязывает значение соответствующего параметра запроса к атрибуту {query.userName}
Заголовок HTTP-запроса {headers.HEADER_NAME} Привязывает значение заголовка к атрибуту {headers.token}

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