Dela via


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. Information om konfiguration och konfigurationsinformation finns i översikten.

Exempel

En C#-funktion kan skapas 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. Isolerad arbetsprocess krävs för att stödja C#-funktioner som körs på LTS- och icke-LTS-versioner .NET och .NET Framework.
  • Processmodell: Kompilerad C#-funktion som körs i samma process som Functions-körningen.
  • C#-skript: Används främst när du skapar C#-funktioner i Azure-portalen.

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

Användning

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

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 som innehåller SignalR Service-niska veze, 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-token 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 Description
Namn Variabelnamn som används i funktionskoden för anslutningsinformationsobjekt.
hubName Obligatoriskt. Hubbens namn.
connectionStringSetting Namnet på appinställningen som innehåller SignalR Service-niska veze, 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-token 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 Description
Namn Variabelnamn som används i funktionskoden för anslutningsinformationsobjekt.
hubName Obligatoriskt. Hubbens namn.
connectionStringSetting Namnet på appinställningen som innehåller SignalR Service-niska veze, 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-token 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 som innehåller SignalR Service-niska veze, 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-token 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 .

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