SignalR Service-indatabindning för Azure Functions

Innan en klient kan ansluta till Azure SignalR Service måste den hämta tjänstens slutpunkts-URL och en giltig åtkomsttoken. SignalRConnectionInfo-indatabindningen genererar signalR-tjänstens slutpunkts-URL och en giltig token som används för att ansluta till tjänsten. Token är tidsbegränsad och kan användas för att autentisera en specifik användare till en anslutning. Därför bör du inte cachelagrat token eller dela den mellan klienter. Vanligtvis använder du SignalRConnectionInfo med HTTP-utlösare för klienter för att hämta anslutningsinformationen.

Mer information om hur du använder den här bindningen för att skapa en "negotiate"-funktion som är kompatibel med en SignalR-klient-SDK finns i Azure Functions-utveckling och konfiguration med Azure SignalR Service.

När du inte uttryckligen deklarerat förutsätter du att exempel använder standardinställningsvärdet för anslutningen för AzureSignalRConnectionString. Information om konfiguration och konfigurationsinformation finns i översikten.

Exempel

Du kan skapa en C#-funktion med något av följande C#-lägen:

  • Isolerad arbetsmodell: Kompilerad C#-funktion som körs i en arbetsprocess som är isolerad från körningen. En isolerad arbetsprocess krävs för att stödja C#-funktioner som körs på långsiktig support (LTS) och icke-LTS-versioner för .NET och .NET Framework.
  • Processmodell: Kompilerad C#-funktion som körs i samma process som Azure Functions-körningen.
  • C#-skript: Används främst när du skapar C#-funktioner i Azure Portal.

I följande exempel visas en C#-funktion som hämtar SignalR-anslutningsinformation med hjälp av indatabindningen och returnerar den via 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;
}

I följande exempel visas en SignalR-anslutningsinformationsindatabindning i en function.json-fil och en funktion som använder bindningen för att returnera anslutningsinformationen.

Här är bindningsdata för exemplet i filen function.json :

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

Här är JavaScript-koden:

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

Slutför PowerShell-exempel väntar.

I följande exempel visas en SignalR-anslutningsinformationsindatabindning i en function.json-fil och en Python-funktion som använder bindningen för att returnera anslutningsinformationen.

Här är Python-koden:

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

I följande exempel visas en Java-funktion som hämtar SignalR-anslutningsinformation med hjälp av indatabindningen och returnerar den via 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;
}

Attribut

C#-bibliotek för både process- och isolerad arbetsprocess använder attribut för att definiera funktionen. C#-skriptet använder i stället en function.json konfigurationsfil.

I följande tabell förklaras egenskaperna för attributet SignalRConnectionInfoInput :

Attributegenskap beskrivning
HubName Obligatoriskt. Hubbens namn.
ConnectionStringSetting Namnet på appinställningen eller inställningssamlingen som innehåller SignalR Service-anslutningssträng, som standard är AzureSignalRConnectionString.
AnvändarID Valfritt. Användaridentifieraren för en SignalR-anslutning. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga.
IdToken Valfritt. En JWT vars anspråk läggs till i användaranspråken. Den bör användas tillsammans med ClaimTypeList. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga.
ClaimTypeList Valfritt. En lista över anspråkstyper som filtrerar anspråken i IdToken .

Kommentarer

I följande tabell förklaras de inställningar som stöds för anteckningen SignalRConnectionInfoInput .

Inställning beskrivning
Namn Variabelnamn som används i funktionskoden för anslutningsinformationsobjekt.
hubName Obligatoriskt. Hubbens namn.
connectionStringSetting Namnet på appinställningen eller inställningssamlingen som innehåller SignalR Service-anslutningssträng, som standard är AzureSignalRConnectionString.
userId Valfritt. Användaridentifieraren för en SignalR-anslutning. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga.
idToken Valfritt. En JWT vars anspråk läggs till i användaranspråken. Den bör användas tillsammans med claimTypeList. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga.
claimTypeList Valfritt. En lista över anspråkstyper som filtrerar anspråken i idToken .

Kommentarer

I följande tabell förklaras de inställningar som stöds för anteckningen SignalRConnectionInfoInput .

Inställning beskrivning
Namn Variabelnamn som används i funktionskoden för anslutningsinformationsobjekt.
hubName Obligatoriskt. Hubbens namn.
connectionStringSetting Namnet på appinställningen eller inställningssamlingen som innehåller SignalR Service-anslutningssträng, som standard är AzureSignalRConnectionString.
userId Valfritt. Användaridentifieraren för en SignalR-anslutning. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga.
idToken Valfritt. En JWT vars anspråk läggs till i användaranspråken. Den bör användas tillsammans med claimTypeList. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga.
claimTypeList Valfritt. En lista över anspråkstyper som filtrerar anspråken i idToken .

Konfiguration

I följande tabell förklaras de bindningskonfigurationsegenskaper som du anger i filen function.json .

function.json egenskap beskrivning
typ Måste anges till signalRConnectionInfo.
riktning Måste anges till in.
hubName Obligatoriskt. Hubbens namn.
connectionStringSetting Namnet på appinställningen eller inställningssamlingen som innehåller SignalR Service-anslutningssträng, som standard är AzureSignalRConnectionString.
userId Valfritt. Användaridentifieraren för en SignalR-anslutning. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga.
idToken Valfritt. En JWT vars anspråk läggs till i användaranspråken. Den bör användas tillsammans med claimTypeList. Du kan använda ett bindningsuttryck för att binda värdet till ett HTTP-begärandehuvud eller en fråga.
claimTypeList Valfritt. En lista över anspråkstyper som filtrerar anspråken i idToken .

Varning

För enkelhetens skull utelämnar vi autentiserings- och auktoriseringsdelarna i det här exemplet. Därför är den här slutpunkten offentligt tillgänglig utan några begränsningar. För att säkerställa säkerheten för din förhandlingsslutpunkt bör du implementera lämpliga autentiserings- och auktoriseringsmekanismer baserat på dina specifika krav. Vägledning om hur du skyddar DINA HTTP-slutpunkter finns i följande artiklar:

Förbrukning

Connections

Egenskapen connectionStringSetting sätts till en nyckel i applikationsinställningarna som returnerar ett värde som används av Functions-runtime för att ansluta till Azure SignalR Service-instansen som används av tillägget. Värdet på denna anslutningsegenskapsinställning beror på typen av anslutning:

  • Managed identity-anslutning: Egenskapen connectionStringSetting<CONNECTION_NAME_PREFIX> delas av en grupp inställningar som tillsammans definierar en identitetsbaserad anslutning till tjänsteändpunkten. För mer information, se Definiera identitetskopplingar.
  • Key Vault-referens: Egendomsinställningen connectionStringSetting returnerar en Azure Key Vault-referens till platsen där reťazec pripojenia underhålls centralt. För mer information, se Definiera Key Vault-anslutningar.
  • App Configuration Reference: Egenskapsinställningen connectionStringSetting returnerar en Azure App Configuration-referens som returnerar en reťazec pripojenia eller en Key Vault-referens. För mer information, se Azure App Configuration i artikeln om anslutningar.
  • Connection string: Egenskapsinställningen connectionStringSetting returnerar den faktiska SignalR-service-reťazec pripojenia. Eftersom reťazec pripojenia innehåller delade hemliga nycklar bör du överväga att använda en managed identity-anslutning när det är möjligt. För mer information, se Definiera kopplingar.

För att lära dig mer om bindningsanslutningar, se Hantera anslutning i Azure Functions. För att få en reťazec pripojenia, följ stegen som visas under How to get reťazec pripojenias.

Functions-värden letar efter en nyckel eller ett nyckelprefix som heter AzureSignalRConnectionString när den ansluter till din SignalR-tjänst. Annars använder den nyckelvärdet som satts i connectionStringSetting för att erhålla den nödvändiga anslutningsinformationen.

Autentiserade token

När en autentiserad klient utlöser funktionen kan du lägga till ett användar-ID-anspråk i den genererade token. Du kan enkelt lägga till autentisering i en funktionsapp med App Service-autentisering.

App Service-autentisering anger HTTP-huvuden med namnet x-ms-client-principal-id och x-ms-client-principal-name som innehåller den autentiserade användarens klienthuvudnamn respektive namn.

Du kan ange UserId egenskapen för bindningen till värdet från antingen huvudet med hjälp av ett bindningsuttryck: {headers.x-ms-client-principal-id} eller {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;
}

Här är bindningsdata i filen 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"
}

Här är JavaScript-koden:

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

Slutför PowerShell-exempel väntar.

Här är Python-koden:

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

Bindningsuttryck för HTTP-utlösare

Det är ett vanligt scenario att värdena för vissa attribut för SignalR-indatabindning kommer från HTTP-begäranden. Därför visar vi hur du binder värden från HTTP-begäranden till SignalR-indatabindningsattribut via bindningsuttryck.

HTTP-metadatatyp Format för bindningsuttryck beskrivning Exempel
HTTP-begärandefråga {query.QUERY_PARAMETER_NAME} Binder värdet för motsvarande frågeparameter till ett attribut {query.userName}
HTTP-begärandehuvud {headers.HEADER_NAME} Binder värdet för en rubrik till ett attribut {headers.token}

Nästa steg