Sdílet prostřednictvím


Vstupní vazba služby SignalR pro Azure Functions

Než se klient může připojit ke službě Azure SignalR, musí načíst adresu URL koncového bodu služby a platný přístupový token. Vstupní vazba SignalRConnectionInfo vytvoří adresu URL koncového bodu služby SignalR a platný token, který se používá pro připojení ke službě. Token je časově omezený a dá se použít k ověření konkrétního uživatele pro připojení. Token byste proto neměli ukládat do mezipaměti ani ho sdílet mezi klienty. Obvykle používáte SignalRConnectionInfo s triggerem HTTP pro klienty k načtení informací o připojení.

Další informace o tom, jak pomocí této vazby vytvořit funkci Negotiate, která je kompatibilní s klientskou sadou SDK služby SignalR, najdete v tématu Vývoj a konfigurace služby Azure Functions pomocí služby Azure SignalR. Informace o nastavení a konfiguraci najdete v přehledu.

Příklad

Funkci jazyka C# je možné vytvořit pomocí jednoho z následujících režimů jazyka C#:

  • Izolovaný model pracovního procesu: Kompilovaná funkce jazyka C#, která běží v pracovním procesu, který je izolovaný od modulu runtime. Izolovaný pracovní proces je nutný pro podporu funkcí C# spuštěných na LTS a jiných verzích než LTS .NET a rozhraní .NET Framework.
  • Model v procesu: Zkompilovaná funkce jazyka C#, která běží ve stejném procesu jako modul runtime služby Functions.
  • Skript jazyka C#: Používá se především při vytváření funkcí jazyka C# na webu Azure Portal.

Následující příklad ukazuje funkci jazyka C#, která získává informace o připojení SignalR pomocí vstupní vazby a vrací ji přes protokol 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;
}

Následující příklad ukazuje vstupní vazbu informací o připojení SignalR v souboru function.json a funkci, která používá vazbu k vrácení informací o připojení.

Tady je vazba dat pro příklad v souboru function.json :

{
    "type": "signalRConnectionInfo",
    "name": "connectionInfo",
    "hubName": "hubName1",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "direction": "in"
}

Tady je javascriptový kód:

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],
});

Dokončené příklady PowerShellu čekají na vyřízení.

Následující příklad ukazuje vstupní vazbu informací o připojení SignalR v souboru function.json a funkci Pythonu, která používá vazbu k vrácení informací o připojení.

Tady je kód Pythonu:

def main(req: func.HttpRequest, connectionInfoJson: str) -> func.HttpResponse:
    return func.HttpResponse(
        connectionInfoJson,
        status_code=200,
        headers={
            'Content-type': 'application/json'
        }
    )

Následující příklad ukazuje funkci Java, která získává informace o připojení SignalR pomocí vstupní vazby a vrací ji přes 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;
}

Upozorňující

Pro zjednodušení vynecháme části ověřování a autorizace v této ukázce. V důsledku toho je tento koncový bod veřejně přístupný bez jakýchkoli omezení. Pokud chcete zajistit zabezpečení koncového bodu vyjednávání, měli byste implementovat vhodné mechanismy ověřování a autorizace na základě vašich konkrétních požadavků. Pokyny k ochraně koncových bodů HTTP najdete v následujících článcích:

Využití

Ověřené tokeny

Když ověřený klient aktivuje funkci, můžete do vygenerovaného tokenu přidat deklaraci ID uživatele. Ověřování můžete snadno přidat do aplikace funkcí pomocí ověřování pomocí služby App Service.

Ověřování služby App Service nastaví hlavičky HTTP pojmenované x-ms-client-principal-id a x-ms-client-principal-name obsahují ID a název instančního objektu ověřeného uživatele.

Vlastnost vazby na hodnotu můžete nastavit UserId z hlavičky pomocí vazbového výrazu: {headers.x-ms-client-principal-id} nebo {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;
}

Tady jsou data vazby v souboru 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"
}

Tady je javascriptový kód:

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],
});

Dokončené příklady PowerShellu čekají na vyřízení.

Tady je kód Pythonu:

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;
}

Atributy

Knihovny C# v procesu i izolovaného pracovního procesu používají k definování funkce atribut. Skript jazyka C# místo toho používá konfigurační soubor function.json.

Následující tabulka vysvětluje vlastnosti atributu SignalRConnectionInfoInput :

Vlastnost atributu Popis
HubName Povinný: Název centra.
ConnectionStringSetting Název nastavení aplikace, které obsahuje službu SignalR Service připojovací řetězec, což je výchozí hodnota AzureSignalRConnectionString.
UserId Nepovinné. Identifikátor uživatele připojení SignalR. Pomocí vazbového výrazu můžete svázat hodnotu s hlavičkou nebo dotazem požadavku HTTP.
IdToken Nepovinné. Token JWT, jehož deklarace identity se přidají do deklarací identity uživatele. Měl by být použit společně s ClaimTypeList. Pomocí vazbového výrazu můžete svázat hodnotu s hlavičkou nebo dotazem požadavku HTTP.
ClaimTypeList Nepovinné. Seznam typů deklarací identity, které filtruje deklarace identity v IdToken .

Poznámky

Následující tabulka vysvětluje podporovaná nastavení poznámky SignalRConnectionInfoInput .

Nastavení Description
Jméno Název proměnné použitý v kódu funkce pro objekt informace o připojení.
hubName Povinný: Název centra.
connectionStringSetting Název nastavení aplikace, které obsahuje službu SignalR Service připojovací řetězec, což je výchozí hodnota AzureSignalRConnectionString.
userId Nepovinné. Identifikátor uživatele připojení SignalR. Pomocí vazbového výrazu můžete svázat hodnotu s hlavičkou nebo dotazem požadavku HTTP.
idToken Nepovinné. Token JWT, jehož deklarace identity se přidají do deklarací identity uživatele. Měl by být použit společně s claimTypeList. Pomocí vazbového výrazu můžete svázat hodnotu s hlavičkou nebo dotazem požadavku HTTP.
claimTypeList Nepovinné. Seznam typů deklarací identity, které filtruje deklarace identity v idToken .

Poznámky

Následující tabulka vysvětluje podporovaná nastavení poznámky SignalRConnectionInfoInput .

Nastavení Description
Jméno Název proměnné použitý v kódu funkce pro objekt informace o připojení.
hubName Povinný: Název centra.
connectionStringSetting Název nastavení aplikace, které obsahuje službu SignalR Service připojovací řetězec, což je výchozí hodnota AzureSignalRConnectionString.
userId Nepovinné. Identifikátor uživatele připojení SignalR. Pomocí vazbového výrazu můžete svázat hodnotu s hlavičkou nebo dotazem požadavku HTTP.
idToken Nepovinné. Token JWT, jehož deklarace identity se přidají do deklarací identity uživatele. Měl by být použit společně s claimTypeList. Pomocí vazbového výrazu můžete svázat hodnotu s hlavičkou nebo dotazem požadavku HTTP.
claimTypeList Nepovinné. Seznam typů deklarací identity, které filtruje deklarace identity v idToken .

Konfigurace

Následující tabulka vysvětluje vlastnosti konfigurace vazby, které jste nastavili v souboru function.json .

vlastnost function.json Popis
type Musí být nastavena na signalRConnectionInfohodnotu .
direction Musí být nastavena na inhodnotu .
hubName Povinný: Název centra.
connectionStringSetting Název nastavení aplikace, které obsahuje službu SignalR Service připojovací řetězec, což je výchozí hodnota AzureSignalRConnectionString.
userId Nepovinné. Identifikátor uživatele připojení SignalR. Pomocí vazbového výrazu můžete svázat hodnotu s hlavičkou nebo dotazem požadavku HTTP.
idToken Nepovinné. Token JWT, jehož deklarace identity se přidají do deklarací identity uživatele. Měl by být použit společně s claimTypeList. Pomocí vazbového výrazu můžete svázat hodnotu s hlavičkou nebo dotazem požadavku HTTP.
claimTypeList Nepovinné. Seznam typů deklarací identity, které filtruje deklarace identity v idToken .

Vazbové výrazy pro trigger HTTP

Jedná se o běžný scénář, kdy hodnoty některých atributů vstupní vazby SignalR pocházejí z požadavků HTTP. Proto si ukážeme, jak vytvořit vazbu hodnot z požadavků HTTP na atributy vstupní vazby SignalR prostřednictvím vazbového výrazu.

Typ metadat HTTP Formát vazby výrazu Popis Příklad
Dotaz požadavku HTTP {query.QUERY_PARAMETER_NAME} Vytvoří vazbu hodnoty odpovídajícího parametru dotazu na atribut. {query.userName}
Hlavička požadavku HTTP {headers.HEADER_NAME} Vytvoří vazbu hodnoty hlavičky na atribut. {headers.token}

Další kroky