Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:
- 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.
- 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.
- 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
AzureBotOAuthConnectionNameeines 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 BeispielGetTurnTokenAsynczum Lesen eines Tokens undExchangeTurnTokenAsynczum Durchführen eines OBO-Austauschs. Die entsprechenden Oberflächen lautenauthorizationin JavaScript undauthin 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 |