Ihren Agent für die Verwendung von OAuth konfigurieren

Ein Agent nutzt OAuth, um Benutzer anzumelden und Token für nachgelagerte Ressourcen (wie Microsoft Graph) zu erhalten, ohne selbst die Zugangsdaten zu verarbeiten. Der Azure Bot Service verwaltet den Token-Austausch, und der Agent ruft das resultierende Benutzer-Token während eines Zuges ab.

Übersicht

Die Verwendung von OAuth in einem Agent umfasst drei Schritte:

  1. OAuth für den Azure-Bot und die App-Registrierung konfigurieren: Erstellen Sie eine oder mehrere OAuth-Verbindungen für Ihre Azure-Bot-Ressource, die jeweils auf einer Microsoft Entra ID-App-Registrierung basieren. Benutzerautorisierung mithilfe von Anmeldedaten aus einem Verbund beschreibt den gängigsten Ansatz. Auch andere Arten von Anmeldedaten, wie beispielsweise Client-Geheimnisse oder Zertifikate, werden unterstützt. Eine vollständige Übersicht über die Optionen finden Sie unter Grundlagen zur Authentifizierung beim Bot-Dienst.
  2. Konfigurieren Sie die entsprechenden Einstellungen im Agent: Jede OAuth-Verbindung im Azure Bot ist einem OAuth-Handler in der Konfiguration des Agent zugeordnet. Siehe auch Einstellungen. Für die allgemeine Agenteneinrichtung siehe Was ist das Microsoft 365 Agents SDK.
  3. Verwenden Sie die Tokens im Code: Rufen Sie während eines Zuges das Benutzer-Token ab – oder führen Sie einen „On-Behalf-Of“-Austausch (OBO) durch – über die API zur Benutzerautorisierung des Agenten. Siehe Verwendung des Tokens im Code (nicht-OBO) und Verwendung des Tokens im Code (OBO).

Behalten Sie beim Lesen des restlichen Artikels die folgenden Konzepte im Hinterkopf:

  • Ein Azure Bot kann mehrere OAuth-Verbindungen enthalten. Zum Beispiel eine Verbindung für Microsoft Graph und eine weitere für GitHub. Jede Verbindung wird im Azure Bot separat konfiguriert.
  • Zwischen einer OAuth-Verbindung im Azure Bot und einem OAuth-Handler im Agent besteht eine 1:1-Beziehung. Die Einstellung AzureBotOAuthConnectionName eines Handlers bezeichnet die von ihm verwendete Azure-Bot-Verbindung. Um zwei Verbindungen zu verwenden, definieren Sie zwei Handler.
  • Die API zur Benutzerautorisierung des Agent ist die Schnittstelle, die Sie im Code aufrufen. In .NET ist dies AgentApplication.UserAuthorization – zum Beispiel GetTurnTokenAsync zum Lesen eines Tokens und ExchangeTurnTokenAsync zum Durchführen eines OBO-Austauschs. Die entsprechenden Oberflächen lauten authorization in JavaScript und auth in Python.

Funktionsfähige Beispiele finden Sie in den Beispielen zur automatischen Anmeldung und zu OBO für:

Sprachunterstützung für OAuth

Das Agents SDK unterstützt OAuth für .NET, JavaScript und Python. Die Kernkonzepte sind in jeder Sprache dieselben: OAuth-Handler, das Zuweisen von Handlern zu Routen und der OBO-Austausch. Es unterscheiden sich lediglich das Konfigurationsformat und die Namen der Handler-APIs:

Sprache Wo Sie konfigurieren API-Surface
.NET appsettings.json (oder Code in Program.cs) AgentApplication.UserAuthorization
JavaScript .env Umgebungsvariablen AgentApplication.authorization
Python .env Umgebungsvariablen AgentApplication.auth

Bei JavaScript und Python verwenden die .env-Schlüssel dieselben hierarchischen Namen wie die .NET-appsettings.json-Struktur, wobei die einzelnen Ebenen durch einen doppelten Unterstrich (__) voneinander getrennt sind. JavaScript-Schlüssel behalten die in den Tabellen angezeigten Blattnamen im CamelCase bei (zum Beispiel azureBotOAuthConnectionName). Python-Schlüssel sind Großbuchstaben (zum Beispiel ). AZUREBOTOAUTHCONNECTIONNAME

Wichtig

Globale automatische Anmeldung (AutoSignIn) und DefaultHandlerName werden nur in .NET unterstützt. In JavaScript und Python ordnen Sie OAuth-Handler bestimmten Routen zu, wie unter Konfiguration pro Route gezeigt.

Einstellungen

Ein Benutzerautorisierungsobjekt innerhalb von AgentApplication steuert, wie der Agent Benutzer-Token abruft. Jeder Handler muss zumindest die von ihm verwendete Azure Bot-OAuth-Verbindung benennen. Die folgenden Beispiele veranschaulichen die minimale Struktur in den jeweiligen Sprachen. Die folgenden Tabellen beschreiben die übrigen verfügbaren Eigenschaften, und die OBO-Abschnitte behandeln die Einstellungen OBOConnectionName und OBOScopes.

In .NET konfigurieren Sie die Benutzerautorisierung unter AgentApplication in appsettings.json:

  "AgentApplication": {
    "UserAuthorization": {
      "DefaultHandlerName": "{{handler-name}}",
      "AutoSignIn": true | false,
      "Handlers": {
        "{{handler-name}}": {
          "Settings": {
            "AzureBotOAuthConnectionName": "{{azure-bot-connection-name}}"
          }
        }
      }
    }
  }

Konfigurieren Sie in JavaScript die Benutzerautorisierung mit den Umgebungsvariablen in der .env-Datei:

# Connection used to authenticate the agent itself
connections__serviceConnection__settings__clientId=
connections__serviceConnection__settings__clientSecret=
connections__serviceConnection__settings__tenantId=
connectionsMap__0__connection=serviceConnection
connectionsMap__0__serviceUrl=*

# OAuth handler named "{{handler-name}}"
AgentApplication__UserAuthorization__Handlers__{{handler-name}}__Settings__azureBotOAuthConnectionName={{azure-bot-connection-name}}

Konfigurieren Sie in Python die Benutzerautorisierung mit den Umgebungsvariablen in der .env-Datei:

# Connection used to authenticate the agent itself
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID=

# OAuth handler named "{{handler-name}}"
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__{{handler-name}}__SETTINGS__AZUREBOTOAUTHCONNECTIONNAME={{azure-bot-connection-name}}

UserAuthorization-Eigenschaften

Die folgende Tabelle listet die obersten UserAuthorization-Eigenschaften auf, die bestimmen, wie Handler ausgewählt werden und wie Token für jede eingehende Aktivität erworben werden.

Eigenschaften Erforderlich type Beschreibung des Dataflows
DefaultHandlerName Nein (empfohlen) string Nur .NET. Der Name des Handlers, der verwendet wird, wenn AutoSignIn als wahr ausgewertet wird und keine Außerkraftsetzung pro Route angegeben ist.
AutoSignIn Nein Boolescher Wert oder Delegate Nur .NET. Wenn „true“ (Standardwert) gesetzt ist, versucht der Agent, für jede eingehende Aktivität ein Token zu erwerben. Zur Laufzeit mit Options.AutoSignIn überschreiben, um Aktivitätstypen zu filtern.
Handlers Ja (mindestens ein) Objekt (Wörterbuch) Zuordnung des Handler-Namens zu seiner Konfiguration. Jeder Schlüssel muss eindeutig sein.

Um in .NET einzuschränken, für welche Aktivitäten die automatische Anmeldung gilt, setzen Sie ein Prädikat ähnlich wie: Options.AutoSignIn = (context, ct) => Task.FromResult(context.Activity.IsType(ActivityTypes.Message));. JavaScript und Python unterstützen keine globale automatische Anmeldung. Beschränken Sie die Anmeldung stattdessen auf bestimmte Routen, indem Sie den einzelnen Routen bestimmte Handler-Namen zuweisen, wie in den routenbezogenen Beispielen gezeigt.

Eigenschaften der Einstellungen

Die folgende Tabelle beschreibt das verschachtelte Settings-Objekt, das auf einen einzelnen OAuth-Handler angewendet wird und die Präsentation der Anmeldekarte, das Wiederholungsverhalten, Zeitbegrenzungen sowie die optionale OBO-Austauschkonfiguration steuert.

Eigenschaften Erforderlich type BESCHREIBUNG
AzureBotOAuthConnectionName Ja string OAuth-Verbindungsname, definiert auf der Azure Bot-Ressource
OBOConnectionName Nein (nur OBO) string Name einer Agent-SDK-Verbindung, die verwendet wird, um einen On-Behalf-Of-Token-Austausch durchzuführen.
OBOScopes Nein (nur OBO) string[] Scopes, die während des OBO-Austauschs angefordert werden Wenn OBOConnectionName ausgelassen wird, können Sie ExchangeTurnTokenAsync manuell aufrufen.
Title Nein string Benutzerdefinierte Anmeldung in Kartentitel. Standards zum Anmelden.
Text Nein string Schaltflächentext der Anmeldekarte. Standards zu Bitte anmelden.
InvalidSignInRetryMax Nein Int Maximale Anzahl von Versuchen bei Eingabe eines ungültigen Codes. Standard ist 2.
InvalidSignInRetryMessage Nein string Nachricht wird nach einer ungültigen Codeeingabe angezeigt. Gibt standardmäßig Ungültiger Anmeldecode. Geben Sie den 6-stelligen Code ein. zurück.
Timeout Nein int (ms) Anzahl der Millisekunden bis zum Ablauf eines laufenden Anmeldeversuchs. Der Standardwert beträgt 900000 (15 Minuten).

Anmerkung

AzureBotOAuthConnectionName, OBOConnectionName, OBOScopes, Titleund Text gilt für alle drei Sprachen (unter Verwendung der in Sprachunterstützung für OAuth beschriebenen Groß-/Kleinschreibung der Schlüssel pro Sprache). InvalidSignInRetryMax, InvalidSignInRetryMessage und Timeout sind .NET-Einstellungen.

Welchen Typ sollten Sie verwenden?

Verwenden Sie die folgende Tabelle, um zu entscheiden, welcher Ansatz für Ihr Szenario geeignet ist.

Auswahl Verwenden wenn
Auto-Anmeldung (nur .NET) Sie möchten, dass jede eingehende Aktivität automatisch ein Token erhält, oder Sie möchten eine gefilterte Teilmenge (zum Beispiel nur Nachrichten oder alles außer Ereignissen), indem Sie ein Prädikat für UserAuthorizationOptions.AutoSignIn angeben. Unterstützt nur in .NET.
Pro Route Nur bestimmte Routenhandler benötigen Token oder verschiedene Routen müssen unterschiedliche OAuth-Verbindungen (und damit unterschiedliche Token) verwenden. Diese Option ist die einzige Option in JavaScript und Python. In .NET ist es additiv mit globaler automatischer Anmeldung. Wenn beide in .NET aktiviert sind, hat die Interaktion Zugriff auf Token von beiden.

Verwenden des Tokens im Code (nicht-OBO)

In diesem Abschnitt wird gezeigt, wie Sie das vom Azure Bot OAuth-Connector direkt zurückgegebene Benutzertoken abrufen und verwenden, ohne einen On-Behalf-Of-Austausch durchzuführen. In .NET können Sie die globale automatische Anmeldung oder Handler pro Route verwenden. JavaScript und Python verwenden nur Handler pro Route. Rufen Sie innerhalb Ihres Aktivitäts-Handlers das Token (GetTurnTokenAsync in .NET, authorization.getToken in JavaScript, auth.get_token in Python) so spät wie möglich ab, damit das SDK das Token aktualisieren kann, falls es kurz vor dem Ablauf steht. Die folgenden Beispiele veranschaulichen beide Konfigurationsmuster.

Auto-Anmeldung (nur .NET)

Anmerkung

Globale automatische Anmeldung und DefaultHandlerName werden nur in .NET unterstützt. Für JavaScript und Python verwenden Sie die Per-Route-Konfiguration.

Verwenden Sie diese Konfiguration, wenn die globale automatische Anmeldung ein Token für jede eingehende Aktivität abrufen soll, ohne dass für jeden Routenhandler angegeben werden muss.

  "AgentApplication": {
    "UserAuthorization": {
      "DefaultHandlerName": "auto",
      "Handlers": {
        "auto": {
          "Settings": {
            "AzureBotOAuthConnectionName": "teams_sso",
          }
        }
      }
    }
  },

Ihr Agentcode würde ungefähr wie folgt aussehen:

public class MyAgent : AgentApplication
{
    [MessageRoute]
    public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
    {
        var token = await UserAuthorization.GetTurnTokenAsync(turnContext);

        // use the token 
    }
}

Pro-Route-Konfiguration

Verwenden Sie eine Konfiguration pro Route, wenn Sie detaillierte Kontrolle wünschen: Nur die Routen, die Sie explizit definieren, erhalten Tokens. Die Konfiguration pro Route hat die folgenden Vorteile:

  • Dadurch wird das unnötige Abrufen von Tokens reduziert.
  • Dadurch können verschiedene Routen auf unterschiedliche OAuth-Verbindungen (und somit auf unterschiedliche Ressourcen oder Bereiche) ausgerichtet werden.
  • Damit können Sie authentifizierte und nicht authentifizierte Routen innerhalb desselben Agent miteinander kombinieren.

Im folgenden Beispiel wird ein einzelner graph-Handler ausschließlich an die Nachrichtenroute angehängt.

In .NET ist die globale automatische Anmeldung deaktiviert, und der graph-Handler wird mithilfe von autoSignInHandlers an die Route angehängt.

  "AgentApplication": {
    "UserAuthorization": {
      "AutoSignIn": false,
      "Handlers": {
        "graph": {
          "Settings": {
            "AzureBotOAuthConnectionName": "teams_sso",
          }
        }
      }
    }
  },

Ihr Agentcode würde ungefähr wie folgt aussehen:

public class MyAgent : AgentApplication
{
    [MessageRoute(autoSignInHandlers: "graph")]
    public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
    {
        var token = await UserAuthorization.GetTurnTokenAsync(turnContext, "graph");

        // use the token
    }
}

In JavaScript übergeben Sie ein Array mit den Namen der Handler als letztes Argument bei der Registrierung der Route. Nur diese Route löst die Anmeldung für den Handler graph aus.

AgentApplication__UserAuthorization__Handlers__graph__Settings__azureBotOAuthConnectionName=teams_sso
AgentApplication__UserAuthorization__Handlers__graph__Settings__title=Graph Sign In
AgentApplication__UserAuthorization__Handlers__graph__Settings__text=Sign in with Microsoft Graph

Ihr Agentcode würde ungefähr wie folgt aussehen:

class MyAgent extends AgentApplication {
  constructor () {
    super({ storage: new MemoryStorage() })
    // the `graph` handler runs only for this route
    this.onMessage('-me', this._profileRequest, ['graph'])
  }

  private _profileRequest = async (context, state) => {
    const tokenResponse = await this.authorization.getToken(context, 'graph')

    // use tokenResponse.token
  }
}

In Python übergeben Sie auth_handlers an den Route-Dekorator. Nur diese Route löst die Anmeldung für den Handler GRAPH aus.

AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__GRAPH__SETTINGS__AZUREBOTOAUTHCONNECTIONNAME=teams_sso

Ihr Agentcode würde ungefähr wie folgt aussehen:

@AGENT_APP.message(re.compile(r"^/(me|profile)$", re.IGNORECASE), auth_handlers=["GRAPH"])
async def profile_request(context: TurnContext, state: TurnState) -> None:
    token_response = await AGENT_APP.auth.get_token(context, "GRAPH")

    # use token_response.token

Token während eines Durchlaufs abrufen

Rufen Sie das Benutzer-Token bei Bedarf während eines Durchlaufs ab. Sie können es beliebig oft aufrufen. Rufen Sie es unmittelbar vor der Verwendung auf, damit die Aktualisierungslogik (falls nötig) transparent gehandhabt wird.

Sprache Anruf
.NET GetTurnTokenAsync(turnContext, handlerName)
JavaScript authorization.getToken(context, handlerName)
Python auth.get_token(context, handler_name)

Verwenden des Tokens im Code (OBO)

On-Behalf-Of (OBO) beruht darauf, dass die erste Benutzeranmeldung einen austauschbaren Token zurückgibt. Dazu müssen die Umfänge der OAuth-Verbindung einen Umfang enthalten, der einem von der nachgeschalteten API bereitgestellten Umfang entspricht (zum Beispiel: Wenn der bereitgestellte Umfang defaultScopes ist, könnte der konfigurierte Umfang api://botid-{{clientId}}/defaultScopes sein). Das Agents SDK führt dann einen Microsoft Authentication Library (MSAL) (MSAL)-Tokenaustausch durch, wobei eine konfigurierte Verbindung anhand von OBOConnectionName und der Liste von OBOScopes verwendet wird. Wenn sowohl OBOConnectionName als auch OBOScopes in der Konfiguration vorhanden sind, erfolgt der Austausch automatisch, und Sie erhalten den finalen Token über GetTurnTokenAsync. (GetTurnTokenAsync / getToken / get_token). Wenn eines von beiden fehlt, können Sie den Austausch zur Runtime explizit durchführen (ExchangeTurnTokenAsync in .NET, authorization.exchangeToken in JavaScript und auth.exchange_token in Python), sodass Sie die Verbindung oder die Bereichsliste dynamisch bestimmen können.

OBO in Konfiguration

Verwenden Sie dieses Muster, wenn Sie die Downstream-Ressource und die benötigten Umfänge bereits zur Konfigurationszeit kennen. Wenn Sie sowohl OBOConnectionName als auch OBOScopes bereitstellen, führt das SDK während des Anmeldevorgangs automatisch den On-Behalf-Of-Austausch durch. Das bedeutet, dass nachfolgende Aufrufe des Standard-Token-Getters das OBO-Token direkt zurückgeben, ohne dass zusätzlicher Laufzeitzode erforderlich ist.

  "AgentApplication": {
    "UserAuthorization": {
      "AutoSignIn": false,
      "Handlers": {
        "graph": {
          "Settings": {
            "AzureBotOAuthConnectionName": "teams_sso",
            "OBOConnectionName": "ServiceConnection",
            "OBOScopes": [
              "https://graph.microsoft.com/.default"
            ]
          }
        }
      }
    }
  },
  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "FederatedCredentials",
        "AuthorityEndpoint": "https://login.microsoftonline.com/{{TenantId}}",
        "ClientId": "{{ClientId}}",
        "FederatedClientId": "{{ManagedIdentityClientId}}",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  },

Ihr Agentcode würde ungefähr wie folgt aussehen:

public class MyAgent : AgentApplication
{
    [MessageRoute(autoSignInHandlers: "graph")]
    public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
    {
        // returns the OBO token because OBOConnectionName and OBOScopes are configured
        var token = await UserAuthorization.GetTurnTokenAsync(turnContext, "graph");

        // use the token
    }
}

Definieren Sie in JavaScript eine OBO-Verbindung in der Verbindungenstabelle und verweisen Sie im Handler mit oboConnectionName und oboScopes darauf.

# Agent's own connection
connections__serviceConnection__settings__clientId=
connections__serviceConnection__settings__clientSecret=
connections__serviceConnection__settings__tenantId=

# OBO connection
connections__oboConnection__settings__clientId=
connections__oboConnection__settings__clientSecret=
connections__oboConnection__settings__tenantId=

connectionsMap__0__connection=serviceConnection
connectionsMap__0__serviceUrl=*
connectionsMap__1__connection=oboConnection
connectionsMap__1__serviceUrl=obo

AgentApplication__UserAuthorization__Handlers__graph__Settings__azureBotOAuthConnectionName=teams_sso
AgentApplication__UserAuthorization__Handlers__graph__Settings__oboConnectionName=oboConnection
AgentApplication__UserAuthorization__Handlers__graph__Settings__oboScopes=https://graph.microsoft.com/.default

Ihr Agentcode würde ungefähr wie folgt aussehen:

class MyAgent extends AgentApplication {
  constructor () {
    super({ storage: new MemoryStorage() })
    this.onActivity('message', this._onMessage, ['graph'])
  }

  private _onMessage = async (context, state) => {
    // returns the OBO token because oboConnectionName and oboScopes are configured
    const tokenResponse = await this.authorization.getToken(context, 'graph')

    // use tokenResponse.token
  }
}

Definieren Sie in Python unter CONNECTIONSeine OBO-Verbindung und verweisen Sie im Handler mit OBOCONNECTIONNAME und OBOSCOPES darauf.

# Agent's own connection
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=
CONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID=

# OBO connection
CONNECTIONS__OBO__SETTINGS__CLIENTID=
CONNECTIONS__OBO__SETTINGS__CLIENTSECRET=
CONNECTIONS__OBO__SETTINGS__TENANTID=

AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__GRAPH__SETTINGS__AZUREBOTOAUTHCONNECTIONNAME=teams_sso
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__GRAPH__SETTINGS__OBOCONNECTIONNAME=OBO
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__GRAPH__SETTINGS__OBOSCOPES=https://graph.microsoft.com/.default

Ihr Agentcode würde ungefähr wie folgt aussehen:

@AGENT_APP.message(re.compile(r".*"), auth_handlers=["GRAPH"])
async def on_message(context: TurnContext, state: TurnState) -> None:
    # returns the OBO token because OBOCONNECTIONNAME and OBOSCOPES are configured
    token_response = await AGENT_APP.auth.get_token(context, "GRAPH")

    # use token_response.token

OBO Exchange zur Laufzeit

Verwenden Sie einen Laufzeit-Austausch, wenn Sie die nachgelagerte Ressource, die Bereiche oder die Verbindung in der Konfiguration nicht korrigieren können. Diese Situation tritt beispielsweise auf, wenn Gültigkeitsbereiche vom Mandanten, von der Benutzerrolle oder von einem Feature-Flag abhängen. In diesem Modell konfigurieren Sie optional die OBO-Verbindung und rufen anschließend die Austauschmethode mit den Bereichen auf, die Sie zum Zeitpunkt der Ausführung festlegen. Sie erhalten einen umgetauschten Token, den Sie sofort einlösen können.

Rufen Sie ExchangeTurnTokenAsync mit den Bereichen auf, die Sie zum Zeitpunkt der Durchführung festlegen.

  "AgentApplication": {
    "UserAuthorization": {
      "AutoSignIn": false,
      "Handlers": {
        "graph": {
          "Settings": {
            "AzureBotOAuthConnectionName": "teams_sso",
            "OBOConnectionName": "ServiceConnection"
          }
        }
      }
    }
  },
  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "FederatedCredentials",
        "AuthorityEndpoint": "https://login.microsoftonline.com/{{TenantId}}",
        "ClientId": "{{ClientId}}",
        "FederatedClientId": "{{ManagedIdentityClientId}}",
        "Scopes": [
          "https://api.botframework.com/.default"
        ]
      }
    }
  },

Ihr Agentcode würde ungefähr wie folgt aussehen:

public class MyAgent : AgentApplication
{
    [MessageRoute(autoSignInHandlers: "graph")]
    public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
    {
        var scopes = GetScopes();

        var exchangedToken = await UserAuthorization.ExchangeTurnTokenAsync(turnContext, "graph", exchangeScopes: scopes);

        // use the token
    }
}

Rufen Sie authorization.exchangeToken mit dem Handler-Namen und den Bereichen auf, die Sie zum Zeitpunkt der Durchführung festlegen.

connections__oboConnection__settings__clientId=
connections__oboConnection__settings__clientSecret=
connections__oboConnection__settings__tenantId=

connectionsMap__1__connection=oboConnection
connectionsMap__1__serviceUrl=obo

AgentApplication__UserAuthorization__Handlers__graph__Settings__azureBotOAuthConnectionName=teams_sso
AgentApplication__UserAuthorization__Handlers__graph__Settings__oboConnectionName=oboConnection

Ihr Agentcode würde ungefähr wie folgt aussehen:

class MyAgent extends AgentApplication {
  constructor () {
    super({ storage: new MemoryStorage() })
    this.onActivity('message', this._onMessage, ['graph'])
  }

  private _onMessage = async (context, state) => {
    const scopes = getScopes()
    const exchangedToken = await this.authorization.exchangeToken(context, 'graph', { scopes })

    // use exchangedToken.token
  }
}

Rufen Sie auth.exchange_token mit dem Handler-Namen und den Bereichen auf, die Sie zum Zeitpunkt der Durchführung festlegen.

CONNECTIONS__MCS__SETTINGS__CLIENTID=
CONNECTIONS__MCS__SETTINGS__CLIENTSECRET=
CONNECTIONS__MCS__SETTINGS__TENANTID=

AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__MCS__SETTINGS__AZUREBOTOAUTHCONNECTIONNAME=teams_sso
AGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__MCS__SETTINGS__OBOCONNECTIONNAME=MCS

Ihr Agentcode würde ungefähr wie folgt aussehen:

@AGENT_APP.message(re.compile(r".*"), auth_handlers=["MCS"])
async def on_message(context: TurnContext, state: TurnState) -> None:
    scopes = get_scopes()
    token_response = await AGENT_APP.auth.exchange_token(context, scopes, "MCS")

    # use token_response.token

Regionale OAuth-Einstellungen

Für Regionen außerhalb der USA aktualisieren Sie den Token-Service-Endpunkt, den Ihr Agent verwendet.

Das folgende Beispiel zeigt ein Beispiel für eine .NET-Konfiguration. Zu appsettings.json hinzufügen:

"RestChannelServiceClientFactory": {
   "TokenServiceEndpoint": "{{service-endpoint-uri}}"
}

Für service-endpoint-url verwenden Sie den passenden Wert aus der folgenden Tabelle für Public-Cloud-Bots mit Datenresidenz in der jeweiligen Region.

URI Region
https://europe.api.botframework.com Europa
https://unitedstates.api.botframework.com Vereinigte Staaten
https://india.api.botframework.com Indien