Configurare Single Sign-On in con Microsoft Entra ID
Articolo
Copilot Studio supporta Single Sign-On (SSO). SSO consente ai copiloti nel sito Web di far accedere i clienti se sono già connessi alla pagina o all'app in cui è distribuito il copilota.
Ad esempio, il copilota è ospitato sull'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.
Definire un ambito personalizzato per il tuo copilota.
Configura l'autenticazione in Copilot Studio per abilitare SSO.
Configura il codice HTML canvas personalizzato per abilitare SSO.
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 i copiloti 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.
Seguire le istruzioni per creare nuovamente una registrazione dell'app di autenticazione, per creare una seconda registrazione dell'app, che fungerà da registrazione dell'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 endpoint del token del tuo copilota
In Copilot Studio, apri il copilota, quindi 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, aggiungere 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: '692e92c7-xxxx-4060-76d3-b381798f4d9c',
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://1c0.0.environment.api.powerplatform.com/powervirtualagents/bots/5a099fd/directline/token?api-version=2022-03-01-preview"
Modifica il valore di userId per includere un prefisso personalizzato. Ad esempio:
Metti alla prova il tuo copilota utilizzando la tua pagina Web
Apri la tua pagina web nel browser.
Selezionare Accedi.
Nota
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 il tuo copilota e incolla il codice di convalida nella conversazione del copilota.
Copilot Studio invia una richiesta di accesso per consentire all'utente di accedere con il proprio provider di identità configurato.
Il canvas personalizzato del copilota intercetta la richiesta di accesso e richiede un token On-Behalf-Of (OBO) di Microsoft Entra ID. Il canvas invia il token al copilota.
Alla ricezione del token OBO, il copilota scambia il token OBO con un "token di accesso" e compila la variabile AuthToken utilizzando il valore del 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 utilizzare il nome del copilota di cui stai registrando il canvas e includere "canvas" per separarlo dalla registrazione dell'app per l'autenticazione.
Ad esempio, se il tuo copilota si chiama "Contoso sales help", potresti denominare la registrazione dell'app come "ContosoSalesCanvas" o qualcosa di simile.
In Tipi di account supportati, Seleziona Account in qualsiasi tenant organizzativo (directory Qualsiasi 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.
Nella scheda 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.
Definire un ambito personalizzato per il tuo copilota
Definisci un ambito personalizzato esponendo un'API per la registrazione dell'app canvas nella registrazione dell'app di autenticazione. Gli ambiti consentono di determinare i ruoli degli utenti e degli amministratori 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 ad Autorizzazioni API e assicurati che vengano aggiunte le autorizzazioni corrette per il tuo copilota. 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 il copilota per il quale desideri abilitare l'autenticazione selezionando l'icona del copilota nel menu in alto e scegliendo il copilota corretto.
Nel menu di navigazione, in Impostazioni seleziona Sicurezza. Quindi, seleziona la scheda Autenticazione.
Immetti l'URI dell'ambito completo dal pannello Esporre un'API per la registrazione dell'app di autenticazione del copilota nel campo URL di scambio del token. L'URI è nel formato api://1234-4567/scope.name.
Quindi, seleziona Salva e pubblica il contenuto del copilota.
Configurare il codice HTML canvas personalizzato per abilitare SSO
Aggiorna la pagina del canvas personalizzato in cui si trova il copilota per intercettare la richiesta della scheda di accesso 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 richiama un metodo per recuperare e scambiare il token corrente con un token richiesto dal prompt. resourceUrl 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 un'azione condizionale al tuo store, con l'identificatore univoco del copilota. Genera anche un ID univoco come la tua variabile userId.
Aggiorna <COPILOT ID> con l'ID del tuo copilota. Puoi vedere l'ID del tuo copilota andando nella scheda Canali per il copilota che stai utilizzando e selezionando App per dispositivi mobili nel portale Copilot Studio.
<script>
(async function main() {
// Add your COPILOT 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') {
// copilot 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.