Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Konfigurera först OAuth för en agent på din Azure Bot-resurs och motsvarande appregistrering. Agentkörningen hämtar och uppdaterar sedan användartoken via funktionen AgentApplication för automatisk inloggning. Automatisk inloggning kan köras globalt (alla aktivitetstyper) eller selektivt så att endast vissa vägar eller aktivitetstyper begär en token.
Du kan registrera flera OAuth-hanterare i konfigurationen och tilldela dem till specifika vägar, eller deklarera en enda standardhanterare som används överallt. Om Azure-sidan har konfigurerats för det, kan varje hanterare eventuellt utföra On-Behalf-Of (OBO)-utbyten. För en snabb start, se autosigneringsexemplet, eller anpassa konfigurationen som visas här till en befintlig agent.
I följande avsnitt beskrivs hur du konfigurerar UserAuthorization, väljer mellan globala metoder och per väg-metoder samt hämtar token (standard och OBO) under en omgång. Regional vägledning ges också för distributioner som inte är amerikanska.
Språkstöd för OAuth
Agent-SDK stöder OAuth för alla språk. Detaljerna är likartade mellan olika språk. Kodexemplen i den här artikeln är specifika för .NET.
Du konfigurerar en .NET agent i appSettings.json eller via kod i Program.cs. Den här artikeln beskriver hur du konfigurerar med hjälp av appSettings.json.
Settings
Ett UserAuthorization objekt inuti AgentApplication styr hur agenten hämtar användartoken. Följande JSON och andra liknande exempel i artikeln visar den hierarkiska strukturen. Tabellerna som följer beskriver varje egenskap för UserAuthorization och för det kapslade Settings objektet.
"AgentApplication": {
"UserAuthorization": {
"DefaultHandlerName": "{{handler-name}}",
"AutoSignIn": true | false,
"Handlers": {
"{{handler-name}}": {
"Settings": {
"AzureBotOAuthConnectionName": "{{azure-bot-connection-name}}",
"OBOConnectionName": "{{connection-name}}",
"OBOScopes": [
"{{obo-scope}}"
],
"Title": "{{signin-card-title}}",
"Text": "{{signin-card-button-text}}",
"InvalidSignInRetryMax": {{int}},
"InvalidSignInRetryMessage": {{invalid-attempt-message}},
"Timeout": {{timeout-ms}}
}
}
}
}
}
UserAuthorization-egenskaper
I följande tabell visas de egenskaper på den översta nivån UserAuthorization som avgör hur hanterare väljs och hur token hämtas för varje inkommande aktivitet.
| Fastighet | Obligatoriskt | Type | Description |
|---|---|---|---|
DefaultHandlerName |
Nej (rekommenderas) | string | Namnet på hanteraren som används när AutoSignIn utvärderas till sant och ingen åsidosättning per väg har angetts. |
AutoSignIn |
No | bool eller ombud | När det är sant (standard) försöker agenten hämta en token för varje inkommande aktivitet. Kan åsidosättas under körning med Options.AutoSignIn för att filtrera aktivitetstyper. |
Handlers |
Ja (minst en) | objekt (ordlista) | Mappning av hanterarnamn till dess konfiguration. Varje nyckel måste vara unik. |
Om du vill begränsa vilka aktiviteter som automatisk inloggning gäller för anger du ett predikat som liknar: Options.AutoSignIn = (context, ct) => Task.FromResult(context.Activity.IsType(ActivityTypes.Message));.
Egenskaper för inställningar
I följande tabell beskrivs det kapslade Settings objektet som tillämpas på en enskild OAuth-hanterare, som styr presentationen av inloggningskort, återförsöksbeteende, tidsgränser och valfri OBO-utbyteskonfiguration.
| Fastighet | Obligatoriskt | Type | Description |
|---|---|---|---|
AzureBotOAuthConnectionName |
Ja | string | OAuth-anslutningsnamn som definierats för Azure Bot-resursen. |
OBOConnectionName |
Nej (endast OBO) | string | Namnet på en Agents SDK-anslutning som används för att utföra ett On-Behalf-Of-tokenutbyte. |
OBOScopes |
Nej (endast OBO) | string[] | Omfång som begärdes under OBO-utbytet. Om det utelämnas med OBOConnectionNamekan du anropa ExchangeTurnTokenAsync manuellt. |
Title |
No | string | Anpassad rubrik för inloggningskort. Standardinställningen är Inloggning. |
Text |
No | string | Knapptext för inloggningskort. Standardvärdet är Logga in. |
InvalidSignInRetryMax |
No | int | Maximalt antal återförsök som tillåts när användaren anger en ogiltig kod. Standardvärdet är 2. |
InvalidSignInRetryMessage |
No | string | Meddelande som visas efter inmatning av en ogiltig kod. Standardvärdet är Ogiltig inloggningskod. Ange den sexsiffriga koden. |
Timeout |
No | int (ms) | Antal millisekunder innan ett pågående inloggningsförsök upphör att gälla. Standardvärdet är 900000 (15 minuter). |
Vilken typ ska du använda?
Använd följande tabell för att bestämma vilken metod som passar ditt scenario.
| Val | Använd när |
|---|---|
| Automatisk inloggning | Du vill att varje inkommande aktivitet automatiskt ska hämta en token, eller så vill du ha en filtrerad delmängd (till exempel endast meddelanden eller allt utom händelser) genom att ange ett predikat för UserAuthorizationOptions.AutoSignIn. |
| Per väg | Endast specifika routningshanterare behöver token eller olika vägar måste använda olika OAuth-anslutningar (och därför olika token). Den här metoden är additiv med global automatisk inloggning. Om båda är aktiverade har omgången åtkomst till tokens från var och en. |
Använda token i koden (icke-OBO)
Det här avsnittet visar hur du hämtar och använder användartoken som returneras direkt av din Azure Bot OAuth-anslutning utan att utföra ett on-behalf-of-utbyte. Bestäm först om du föredrar global automatisk inloggning eller hanterare per rutt. Därefter anropar du GetTurnTokenAsync i aktivitetsbehandlaren så sent som möjligt, så att SDK:t kan uppdatera tokenen om den snart upphör att gälla. Följande exempel illustrerar båda mönstren.
Konfiguration av endast automatisk inloggning
Använd den här konfigurationen när global automatisk inloggning ska hämta en token för varje inkommande aktivitet utan att behöva ange hanterare per väg.
"AgentApplication": {
"UserAuthorization": {
"DefaultHandlerName": "auto",
"Handlers": {
"auto": {
"Settings": {
"AzureBotOAuthConnectionName": "teams_sso",
}
}
}
}
},
Din agentkod skulle se ut ungefär så här:
public class MyAgent : AgentApplication
{
public MyAgent(AgentApplicationOptions options) : base(options)
{
OnActivity(ActivityTypes.Message, OnMessageAsync, rank: RouteRank.Last);
}
public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
{
var token = await UserAuthorization.GetTurnTokenAsync(turnContext);
// use the token
}
}
Endast konfiguration per väg
Använd en konfiguration per väg när du vill ha detaljerad kontroll: endast de vägar som du uttryckligen markerar hämta token. Konfiguration per väg minskar onödig tokenhämtning, tillåter olika vägar att rikta in sig på distinkta OAuth-anslutningar (och därmed olika resurser eller omfång) och gör att du kan blanda autentiserade och oautentiserade vägar i samma agent. I följande exempel inaktiveras global automatisk inloggning och en enda messageOauth hanterare är endast kopplad till meddelandevägen.
"AgentApplication": {
"UserAuthorization": {
"AutoSignIn": false,
"Handlers": {
"messageOauth": {
"Settings": {
"AzureBotOAuthConnectionName": "teams_sso",
}
}
}
}
},
Din agentkod skulle se ut ungefär så här:
public class MyAgent : AgentApplication
{
public MyAgent(AgentApplicationOptions options) : base(options)
{
OnActivity(ActivityTypes.Message, OnMessageAsync, rank: RouteRank.Last, autoSignInHandlers: ["messageOauth"]);
}
public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
{
var token = await UserAuthorization.GetTurnTokenAsync(turnContext, "messageOauth");
// use the token
}
}
Använd GetTurnTokenAsync
Anropa GetTurnTokenAsync när du behöver användartoken under en tur. Du kan anropa den flera gånger. Anropa den omedelbart före användning så att uppdateringslogik (om det behövs) hanteras transparent.
Använda token i koden (OBO)
On-Behalf-Of (OBO) förlitar sig på att den första användarinloggningen returnerar en utbytbar token. Det kräver att OAuth-anslutningens omfång inkluderar ett som motsvarar ett omfång som exponeras av det underordnade API:et (till exempel om det exponerade omfånget är defaultScopeskan det konfigurerade omfånget vara api://botid-{{clientId}}/defaultScopes). Agent-SDK:t utför sedan ett MSAL-utbyte (Microsofts autentiseringsbibliotek) med hjälp av en konfigurerad anslutning som identifieras av OBOConnectionName och listan med OBOScopes. När både OBOConnectionName och OBOScopes finns i konfigurationen sker utbytet automatiskt och du hämtar den slutliga token via GetTurnTokenAsync. Om någon av dem saknas kan du utföra tokenutbytet explicit vid körning med ExchangeTurnTokenAsync, så att du dynamiskt kan fastställa anslutningen eller omfångslistan.
OBO i konfiguration
Använd det här mönstret när du känner till den underordnade resurs och de omfång som du behöver vid konfigurationen. När du anger både OBOConnectionName och OBOScopes utför SDK:et automatiskt OBO-utbytet (på uppdrag av) under inloggningen. Det innebär att efterföljande anrop till GetTurnTokenAsync returnerar OBO-tokenen direkt utan att någon extra körningskod behövs.
"AgentApplication": {
"UserAuthorization": {
"DefaultHandlerName": "auto",
"Handlers": {
"auto": {
"Settings": {
"AzureBotOAuthConnectionName": "teams_sso",
"OBOConnectionName": "ServiceConnection",
"OBOScopes": [
"https://myservicescope.com/.default"
]
}
}
}
}
},
"Connections": {
"ServiceConnection": {
"Settings": {
"AuthType": "FederatedCredentials",
"AuthorityEndpoint": "https://login.microsoftonline.com/{{TenantId}}",
"ClientId": "{{ClientId}}",
"FederatedClientId": "{{ManagedIdentityClientId}}",
"Scopes": [
"https://api.botframework.com/.default"
]
}
}
},
Din agentkod skulle se ut ungefär så här:
public class MyAgent : AgentApplication
{
public MyAgent(AgentApplicationOptions options) : base(options)
{
OnActivity(ActivityTypes.Message, OnMessageAsync, rank: RouteRank.Last);
}
public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
{
var token = await UserAuthorization.GetTurnTokenAsync(turnContext);
// use the token
}
}
OBO-utbyte under körning
Använd ett körningsutbyte när den underordnade resursen, omfången eller till och med anslutningen du måste använda inte kan åtgärdas i konfigurationen, till exempel när omfång är beroende av klientorganisation, användarroll eller en funktionsflagga. I den här modellen konfigurerar du (valfritt) OBOConnectionName och anropar sedan ExchangeTurnTokenAsync med de omfattningar som du bestämmer vid varje tur, och får då ett utbytt token som du kan använda omedelbart.
"AgentApplication": {
"UserAuthorization": {
"DefaultHandlerName": "auto",
"Handlers": {
"auto": {
"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"
]
}
}
},
Din agentkod skulle se ut ungefär så här:
public class MyAgent : AgentApplication
{
public MyAgent(AgentApplicationOptions options) : base(options)
{
OnActivity(ActivityTypes.Message, OnMessageAsync, rank: RouteRank.Last);
}
public async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken cancellationToken)
{
var scopes = GetScopes();
var exchangedToken = await UserAuthorization.ExchangeTurnTokenAsync(turnContext, exchangeScopes: scopes);
// use the token
}
}
Nationella OAuth-inställningar
För icke-AMERIKANSKA regioner uppdaterar du den tokentjänstslutpunkt som din agent använder.
Lägg till följande kod i appsettings.json:
"RestChannelServiceClientFactory": {
"TokenServiceEndpoint": "{{service-endpoint-uri}}"
}
För service-endpoint-urlanvänder du lämpligt värde från följande tabell för offentliga molnrobotar med datahemvist i den angivna regionen.
| URI | Regionen |
|---|---|
https://europe.api.botframework.com |
Europa |
https://unitedstates.api.botframework.com |
USA |
https://india.api.botframework.com |
India |