Delen via


SignalR Service-invoerbinding voor Azure Functions

Voordat een client verbinding kan maken met Azure SignalR Service, moet deze de URL van het service-eindpunt en een geldig toegangstoken ophalen. De SignalRConnectionInfo-invoerbinding produceert de EINDPUNT-URL van signalR Service en een geldig token dat wordt gebruikt om verbinding te maken met de service. Het token is tijdslimiet en kan worden gebruikt om een specifieke gebruiker te verifiëren bij een verbinding. Daarom moet u het token niet in de cache opslaan of delen tussen clients. Meestal gebruikt u SignalRConnectionInfo met HTTP-trigger voor clients om de verbindingsgegevens op te halen.

Zie Azure Functions-ontwikkeling en -configuratie met Azure SignalR Service voor meer informatie over het gebruik van deze binding om een 'negotiate'-functie te maken die compatibel is met een SignalR-client-SDK. Zie het overzicht voor informatie over het instellen en configureren van details.

Opmerking

U kunt een C#-functie maken met behulp van een van de volgende C#-modi:

  • Geïsoleerd werkrolmodel: gecompileerde C#-functie die wordt uitgevoerd in een werkproces dat is geïsoleerd van de runtime. Geïsoleerd werkproces is vereist voor de ondersteuning van C#-functies die worden uitgevoerd op LTS- en niet-LTS-versies .NET en .NET Framework.
  • In-process model: gecompileerde C#-functie die wordt uitgevoerd in hetzelfde proces als de Functions-runtime.
  • C#-script: wordt voornamelijk gebruikt wanneer u C#-functies maakt in Azure Portal.

In het volgende voorbeeld ziet u een C#-functie die SignalR-verbindingsgegevens verkrijgt met behulp van de invoerbinding en deze retourneert 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;
}

In het volgende voorbeeld ziet u een SignalR-verbindingsgegevensinvoerbinding in een function.json-bestand en een functie die gebruikmaakt van de binding om de verbindingsgegevens te retourneren.

Hier volgen bindingsgegevens voor het voorbeeld in het function.json-bestand :

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

Dit is de JavaScript-code:

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

Volledige PowerShell-voorbeelden zijn in behandeling.

In het volgende voorbeeld ziet u een SignalR-verbindingsgegevensinvoerbinding in een function.json-bestand en een Python-functie die gebruikmaakt van de binding om de verbindingsgegevens te retourneren.

Dit is de Python-code:

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

In het volgende voorbeeld ziet u een Java-functie die SignalR-verbindingsgegevens verkrijgt met behulp van de invoerbinding en deze retourneert 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;
}

Gebruik

Geverifieerde tokens

Wanneer een geverifieerde client de functie activeert, kunt u een gebruikers-id-claim toevoegen aan het gegenereerde token. U kunt eenvoudig verificatie toevoegen aan een functie-app met behulp van App Service-verificatie.

Met App Service-verificatie worden HTTP-headers met de naam x-ms-client-principal-id ingesteld en x-ms-client-principal-name die respectievelijk de client-principal-id en -naam van de geverifieerde gebruiker bevatten.

U kunt de UserId eigenschap van de binding instellen op de waarde vanuit een header met behulp van een bindingexpressie: {headers.x-ms-client-principal-id} of {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;
}

Dit zijn bindingsgegevens in het function.json-bestand :

{
    "type": "signalRConnectionInfo",
    "name": "connectionInfo",
    "hubName": "hubName1",
    "userId": "{headers.x-ms-client-principal-id}",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "direction": "in"
}

Dit is de JavaScript-code:

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

Volledige PowerShell-voorbeelden zijn in behandeling.

Dit is de Python-code:

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

Kenmerken

Zowel in-process als geïsoleerde werkproces C#-bibliotheken gebruiken kenmerk om de functie te definiëren. C#-script maakt in plaats daarvan gebruik van een function.json configuratiebestand.

In de volgende tabel worden de eigenschappen van het SignalRConnectionInfoInput kenmerk uitgelegd:

Kenmerkeigenschap Beschrijving
HubName Vereist. De naam van de hub.
ConnectionStringSetting De naam van de app-instelling die de SignalR Service-verbindingsreeks bevat, die standaard wordt gebruiktAzureSignalRConnectionString.
Gebruikers-id Optioneel. De gebruikers-id van een SignalR-verbinding. U kunt een bindingsexpressie gebruiken om de waarde te binden aan een HTTP-aanvraagheader of -query.
IdToken Optioneel. Een JWT-token waarvan de claims worden toegevoegd aan de gebruikersclaims. Deze moet samen met ClaimTypeList worden gebruikt. U kunt een bindingsexpressie gebruiken om de waarde te binden aan een HTTP-aanvraagheader of -query.
ClaimTypeList Optioneel. Een lijst met claimtypen, waarmee de claims in IdToken worden gefilterd.

Aantekeningen

In de volgende tabel worden de ondersteunde instellingen voor de SignalRConnectionInfoInput aantekening uitgelegd.

Instelling Omschrijving
name Variabelenaam die wordt gebruikt in functiecode voor verbindingsinformatieobject.
hubName Vereist. De naam van de hub.
connectionStringSetting De naam van de app-instelling die de SignalR Service-verbindingsreeks bevat, die standaard wordt gebruiktAzureSignalRConnectionString.
userId Optioneel. De gebruikers-id van een SignalR-verbinding. U kunt een bindingsexpressie gebruiken om de waarde te binden aan een HTTP-aanvraagheader of -query.
idToken Optioneel. Een JWT-token waarvan de claims worden toegevoegd aan de gebruikersclaims. Deze moet samen met claimTypeList worden gebruikt. U kunt een bindingsexpressie gebruiken om de waarde te binden aan een HTTP-aanvraagheader of -query.
claimTypeList Optioneel. Een lijst met claimtypen, waarmee de claims in idToken worden gefilterd.

Aantekeningen

In de volgende tabel worden de ondersteunde instellingen voor de SignalRConnectionInfoInput aantekening uitgelegd.

Instelling Omschrijving
name Variabelenaam die wordt gebruikt in functiecode voor verbindingsinformatieobject.
hubName Vereist. De naam van de hub.
connectionStringSetting De naam van de app-instelling die de SignalR Service-verbindingsreeks bevat, die standaard wordt gebruiktAzureSignalRConnectionString.
userId Optioneel. De gebruikers-id van een SignalR-verbinding. U kunt een bindingsexpressie gebruiken om de waarde te binden aan een HTTP-aanvraagheader of -query.
idToken Optioneel. Een JWT-token waarvan de claims worden toegevoegd aan de gebruikersclaims. Deze moet samen met claimTypeList worden gebruikt. U kunt een bindingsexpressie gebruiken om de waarde te binden aan een HTTP-aanvraagheader of -query.
claimTypeList Optioneel. Een lijst met claimtypen, waarmee de claims in idToken worden gefilterd.

Configuratie

In de volgende tabel worden de bindingsconfiguratie-eigenschappen uitgelegd die u in het function.json-bestand hebt ingesteld.

function.json-eigenschap Beschrijving
type Moet worden ingesteld op signalRConnectionInfo.
direction Moet worden ingesteld op in.
hubName Vereist. De naam van de hub.
connectionStringSetting De naam van de app-instelling die de SignalR Service-verbindingsreeks bevat, die standaard wordt gebruiktAzureSignalRConnectionString.
userId Optioneel. De gebruikers-id van een SignalR-verbinding. U kunt een bindingsexpressie gebruiken om de waarde te binden aan een HTTP-aanvraagheader of -query.
idToken Optioneel. Een JWT-token waarvan de claims worden toegevoegd aan de gebruikersclaims. Deze moet samen met claimTypeList worden gebruikt. U kunt een bindingsexpressie gebruiken om de waarde te binden aan een HTTP-aanvraagheader of -query.
claimTypeList Optioneel. Een lijst met claimtypen, waarmee de claims in idToken worden gefilterd.

Bindingexpressies voor HTTP-trigger

Het is een veelvoorkomend scenario dat de waarden van sommige kenmerken van SignalR-invoerbinding afkomstig zijn van HTTP-aanvragen. Daarom laten we zien hoe u waarden van HTTP-aanvragen koppelt aan SignalR-invoerbindingskenmerken via bindingsexpressie.

HTTP-metagegevenstype Indeling van bindingsexpressie Beschrijving Voorbeeld
HTTP-aanvraagquery {query.QUERY_PARAMETER_NAME} Hiermee wordt de waarde van de bijbehorende queryparameter gekoppeld aan een kenmerk {query.userName}
HTTP-aanvraagheader {headers.HEADER_NAME} Hiermee wordt de waarde van een header gekoppeld aan een kenmerk {headers.token}

Volgende stappen