Configurare Single Sign-On in con Microsoft Entra ID
Articolo
Copilot Studio supporta Single Sign-On (SSO). SSO consente agli agenti sul tuo sito web di registrare i clienti se hanno già effettuato l'accesso alla pagina o all'app in cui è distribuito agente.
Ad esempio, agente è ospitato nell'intranet aziendale o in un'app a cui l'utente ha già effettuato l'accesso.
Sono disponibili quattro passaggi principali per la configurazione di SSO per Copilot Studio:
Crea una registrazione app in Microsoft Entra ID per il canvas personalizzato.
Definisci un ambito personalizzato per il tuo agente.
Configura l'autenticazione in Copilot Studio per abilitare SSO.
Configura il codice HTML canvas personalizzato per abilitare SSO.
La tabella seguente descrive in dettaglio i canali che attualmente supportano SSO. Puoi suggerire di supportare canali aggiuntivi nel forum Copilot Studio Idee.
1 Se hai abilitato anche il canale Teams, devi seguire seguire le istruzioni di configurazione nella Configura Single Sign-On con Microsoft Entra ID per gli agenti nella Microsoft Teams documentazione. Se non si configurano le impostazioni SSO di Teams come indicato in quella pagina, gli utenti non riusciranno mai a eseguire l'autenticazione quando usano il canale Teams.
Segui le istruzioni per creare la registrazione di un'app di autenticazione e per creare una seconda registrazione di app che serve come registrazione della tua app canvas.
Aggiungi l'ID della registrazione dell'app canvas alla registrazione dell'app di autenticazione.
Aggiungere un URL di scambio di token
Per aggiornare le impostazioni di autenticazione di Microsoft Entra ID in Copilot Studio, devi aggiungere l'URL di scambio del token per consentire alla tua app e a Copilot Studio di condividere informazioni.
Nel portale di Azure sul pannello di registrazione dell'app di autenticazione, vai a Esponi un'API.
In Ambiti, seleziona l'icona Copia negli appunti .
In Copilot Studio, nel menu di spostamento in Impostazioni, seleziona Sicurezza, quindi seleziona il riquadro Autenticazione.
Per URL di scambio token (richiesto per SSO), incolla l'ambito che hai copiato in precedenza.
Seleziona Salva.
Configurare la registrazione dell'app canvas
Dopo aver creato la registrazione dell'app canvas, vai a Autenticazione e seleziona Aggiungi una piattaforma.
In Configurazioni della piattaforma seleziona Aggiungi una piattaforma, quindi seleziona Web.
In URI di indirizzamento, inserisci l'URL della tua pagina web, ad esempio http://contoso.com/index.html.
Nella sezione Concessione implicita e flussi ibridi, attiva Token di accesso (usati per flussi impliciti) e Token ID (usati per i flussi impliciti ed ibridi).
Seleziona Configura.
Trova l'URL del token agente endpoint
In Copilot Studio, apri agente e poi Seleziona Canali.
Seleziona App per dispositivi mobili.
In Endpoint token, seleziona Copia.
Configurare SSO nella pagina web
Utilizza il codice fornito nel repository GitHub di Copilot Studio per creare una pagina Web per l'URL di reindirizzamento. Copia il codice dal repository GitHub e modificalo seguendo le istruzioni seguenti.
Nota
Il codice nel repository GitHub richiede che l'utente selezioni un pulsante di accesso o acceda da un sito diverso. Per abilitare l'accesso automatico, aggiungi il seguente codice all'inizio di aysnc function main():
(async function main() {
if (clientApplication.getAccount() == null) {
await clientApplication.loginPopup(requestObj).then(onSignin).catch(function (error) {console.log(error) });
}
// Add your BOT ID below
var theURL =
Vai alla pagina Panoramica nel portale di Azure e copia ID applicazione (client) e ID directory (tenant) dalla registrazione dell'app canvas.
Per configurare la libreria di autenticazione Microsoft (MSAL):
Assegna clientId al tuo ID applicazione (client).
Assegna authority a https://login.microsoftonline.com/ e aggiungi il tuo ID directory (tenant) alla fine.
Ad esempio:
var clientApplication;
(function (){
var msalConfig = {
auth: {
clientId: '00001111-aaaa-2222-bbbb-3333cccc4444',
authority: 'https://login.microsoftonline.com/7ef988bf-xxxx-51af-01ab-2d7fd011db47'
},
Imposta la variabile theURL sull'URL del token endpoint che hai copiato in precedenza. Ad esempio:
(async function main() {
var theURL = "https://<token endpoint URL>"
Modifica il valore di userId per includere un prefisso personalizzato. Ad esempio:
Se il tuo browser blocca i popup o stai utilizzando una finestra di navigazione in incognito o privata, ti verrà richiesto di accedere. Altrimenti, l'accesso viene completato utilizzando un codice di convalida.
Si apre una nuova scheda del browser.
Passa alla nuova scheda e copia il codice di convalida.
Torna alla scheda con agente e incolla il codice di convalida nella conversazione agente.
Copilot Studio invia una richiesta di accesso per consentire all'utente di accedere con il proprio provider di identità configurato.
La tela personalizzata di agente intercetta la richiesta di accesso e richiede un token per conto di (OBO) da Microsoft Entra ID. La tela invia il token a agente.
Dopo aver ricevuto il token OBO, agente scambia il token OBO con un "token di accesso" e compila la variabile AuthToken utilizzando il valore di token di accesso. Anche la variabile IsLoggedIn è impostata in questo momento.
Crea una registrazione app in Microsoft Entra ID per il canvas personalizzato
Per abilitare SSO, sono necessarie due registrazioni di app separate:
Vai a Registrazioni di app, selezionando l'icona o cercando nella barra di ricerca in alto.
Seleziona Nuova registrazione.
Immetti un nome per la registrazione. Può essere utile usare il nome del agente di cui stai registrando la canvas e includere "canvas" per separarlo dalla registrazione dell'app per l'autenticazione.
Ad esempio, se il tuo agente si chiama "Contoso sales help", potresti chiamare la registrazione dell'app "ContosoSalesCanvas" o qualcosa di simile.
In Tipi di account supportati, seleziona Account in qualsiasi tenant organizzativo (qualsiasi directory di Microsoft Entra ID - Multitenant) e account Microsoft personali (ad esempio Skype, Xbox).
Lascia la sezione URI di reindirizzamento vuota per il momento, poiché inserirai le informazioni nei passaggi successivi. Selezionare Registrazione.
Una volta completata la registrazione, viene aperta la pagina Panoramica. Vai a Manifesto. Verifica che accessTokenAcceptedVersion sia impostato su 2. In caso contrario, modificalo in 2 e seleziona Salva.
Aggiungi l'URL di reindirizzamento
Con la registrazione aperta, vai a Autenticazione e seleziona Aggiungi una piattaforma.
Nel pannello Configura piattaforme seleziona Web.
In URL di reindirizzamento, aggiungi l'URL completo alla pagina in cui è ospitato il canvas della chat. Nella sezione Concessione implicita, seleziona le caselle di controllo Token di ID e Token di accesso.
Seleziona Configura per confermare le modifiche.
Vai ad Autorizzazioni API. Seleziona Concedi consenso amministratore per <nome del tenant> e quindi Sì.
Importante
Per evitare che gli utenti debbano fornire il consento per ciascuna applicazione, un amministratore globale, un amministratore dell'applicazione o un amministratore dell'applicazione cloud deve concedere il consenso a livello di tenant alle registrazioni della tua app.
Definisci un ambito personalizzato per il tuo agente
Definisci un ambito personalizzato esponendo un'API per la registrazione dell'app canvas nella registrazione dell'app di autenticazione. Gli ambiti ti consentono di determinare i ruoli utente e amministratore e i diritti di accesso.
Questo passaggio ti consente di creare una relazione di trust tra la registrazione dell'app di autenticazione per l'autenticazione e la registrazione dell'app per il canvas personalizzato.
Vai su Autorizzazioni API e assicurati che siano aggiunte le autorizzazioni corrette per il tuo agente. Seleziona Concedi consenso amministratore per <nome del tenant> e quindi Sì.
Importante
Per evitare che gli utenti debbano fornire il consento per ciascuna applicazione, un amministratore globale, un amministratore dell'applicazione o un amministratore dell'applicazione cloud deve concedere il consenso a livello di tenant alle registrazioni della tua app.
Vai a Esponi un'API e seleziona Aggiungi un ambito.
Immetti un nome per l'ambito, insieme alle informazioni di visualizzazione che dovrebbero essere mostrate agli utenti quando accedono alla schermata SSO. Seleziona Aggiungi ambito.
Seleziona Aggiungi applicazione client.
Inserisci l'ID applicazione (client) dalla pagina Panoramica per la registrazione dell'app canvas nel campo ID client. Seleziona la casella di controllo per l'ambito elencato che hai creato.
Seleziona Aggiungi applicazione.
Configurare l'autenticazione in Copilot Studio per abilitare SSO
L'URL di scambio token nella pagina di configurazione dell'autenticazione Copilot Studio viene utilizzato per scambiare il token OBO con il token di accesso richiesto tramite il bot framework.
Copilot Studio chiama Microsoft Entra ID per eseguire lo scambio effettivo.
Accedere a Copilot Studio.
Conferma di aver selezionato l'agente per cui desideri abilitare l'autenticazione selezionando l'icona agente nel menu in alto e scegliendo l'agente corretto.
Nel menu di navigazione, in Impostazioni seleziona Sicurezza. Quindi, seleziona la scheda Autenticazione.
Inserisci l'URI completo dalla sezione Esponi un'API per la registrazione dell'app di autenticazione agente nel campo URL di scambio token . L'URI è nel formato api://1234-4567/scope.name.
Seleziona Salva e poi pubblica il contenuto agente.
Configurare il codice HTML canvas personalizzato per abilitare SSO
Aggiornare la pagina canvas personalizzata in cui si trova agente per intercettare la richiesta di accesso scheda e scambiare il token OBO.
Configura la Microsoft Authentication Library (MSAL) aggiungendo il seguente codice in un tag <script> nella sezione <head>.
Aggiorna clientId con l'ID applicazione (client) per la registrazione dell'app canvas. Sostituisci <Directory ID> con l'ID directory (tenant). Ottieni questi ID dalla pagina Panoramica per la registrazione dell'app canvas.
<head>
<script>
var clientApplication;
(function () {
var msalConfig = {
auth: {
clientId: '<Client ID [CanvasClientId]>',
authority: 'https://login.microsoftonline.com/<Directory ID>'
},
cache: {
cacheLocation: 'localStorage',
storeAuthStateInCookie: false
}
};
if (!clientApplication) {
clientApplication = new Msal.UserAgentApplication(msalConfig);
}
} ());
</script>
</head>
Inserisci il seguente <script> nella sezione <body>. Questo script chiama un metodo per recuperare resourceUrl e scambia il token corrente con un token richiesto dal prompt di OAuth.
<script>
function getOAuthCardResourceUri(activity) {
if (activity &&
activity.attachments &&
activity.attachments[0] &&
activity.attachments[0].contentType === 'application/vnd.microsoft.card.oauth' &&
activity.attachments[0].content.tokenExchangeResource) {
// asking for token exchange with Microsoft Entra ID
return activity.attachments[0].content.tokenExchangeResource.uri;
}
}
function exchangeTokenAsync(resourceUri) {
let user = clientApplication.getAccount();
if (user) {
let requestObj = {
scopes: [resourceUri]
};
return clientApplication.acquireTokenSilent(requestObj)
.then(function (tokenResponse) {
return tokenResponse.accessToken;
})
.catch(function (error) {
console.log(error);
});
}
else {
return Promise.resolve(null);
}
}
</script>
Inserisci il seguente <script> nella sezione <body>. All'interno del metodo main , questo codice aggiunge una condizione al tuo store, con l'identificatore univoco del tuo agente. Genera anche un ID univoco come la tua variabile userId.
Aggiorna <COPILOT ID> con l'ID del tuo agente. Puoi vedere l'ID del tuo agente andando alla scheda Canali del agente che stai utilizzando e selezionando App mobile sul Copilot Studio portale.
<script>
(async function main() {
// Add your AGENT ID below
var BOT_ID = "<BOT ID>";
var theURL = "https://powerva.microsoft.com/api/botmanagement/v1/directline/directlinetoken?botId=" + BOT_ID;
const {
token
} = await fetchJSON(theURL);
var directline = await fetchJSON(regionalChannelSettingsURL).then(res=> res.channelUrlsById.directline);
const directLine = window.WebChat.createDirectLine({
domain: `${directline}v3/directline`,
token
});
var userID = clientApplication.account?.accountIdentifier != null ?
("Your-customized-prefix-max-20-characters" + clientApplication.account.accountIdentifier).substr(0, 64) :
(Math.random().toString() + Date.now().toString()).substr(0, 64); // Make sure this will not exceed 64 characters
const store = WebChat.createStore({}, ({
dispatch
}) => next => action => {
const {
type
} = action;
if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
dispatch({
type: 'WEB_CHAT/SEND_EVENT',
payload: {
name: 'startConversation',
type: 'event',
value: {
text: "hello"
}
}
});
return next(action);
}
if (action.type === 'DIRECT_LINE/INCOMING_ACTIVITY') {
const activity = action.payload.activity;
let resourceUri;
if (activity.from && activity.from.role === 'bot' &&
(resourceUri = getOAuthCardResourceUri(activity))) {
exchangeTokenAsync(resourceUri).then(function(token) {
if (token) {
directLine.postActivity({
type: 'invoke',
name: 'signin/tokenExchange',
value: {
id: activity.attachments[0].content.tokenExchangeResource.id,
connectionName: activity.attachments[0].content.connectionName,
token,
},
"from": {
id: userID,
name: clientApplication.account.name,
role: "user"
}
}).subscribe(
id => {
if (id === 'retry') {
// The agent was not able to handle the invoke, so display the oauthCard
return next(action);
}
// else: tokenexchange successful and we do not display the oauthCard
},
error => {
// an error occurred to display the oauthCard
return next(action);
}
);
return;
} else
return next(action);
});
} else
return next(action);
} else
return next(action);
});
const styleOptions = {
// Add styleOptions to customize Web Chat canvas
hideUploadButton: true
};
window.WebChat.renderWebChat({
directLine: directLine,
store,
userID: userID,
styleOptions
},
document.getElementById('webchat')
);
})().catch(err => console.error("An error occurred: " + err));
</script>
Codice di esempio completo
Per ulteriori informazioni, puoi trovare il codice di esempio completo, con gli script condizionali MSAL e store già inclusi nel repository GitHub.