Настройка единого входа с помощью Microsoft Entra ID
Статья
Copilot Studio поддерживает единый вход. Единый вход поддерживает помощника, поэтому чат-боты на вашем сайте могут выполнить вход в систему для клиентов, если они уже вошли на страницу или в приложение, где развернут помощник.
Например, помощник размещается в корпоративной интрасети или в приложении, в которое пользователь уже вошел.
Существует четыре основных шага для настройки единого входа для Copilot Studio:
Создайте регистрацию приложения в Microsoft Entra ID для пользовательского холста.
Определите настраиваемую область действия для вашего помощника.
Настройка проверки подлинности в Copilot Studio для включения SSO.
Настройте HTML-код настраиваемого холста, чтобы включить SSO.
1 Если у вас также включен канал Teams, вам необходимо следовать инструкциям по настройке в документации Настройка единого входа с помощью Microsoft Entra ID для помощников в Microsoft Teams. Если вы не настроите параметры единого входа Teams в соответствии с инструкциями на упомянутой странице, проверка подлинности ваших пользователей всегда будет неуспешной при использовании канала Teams.
Повторите инструкции по созданию регистрации приложения аутентификации, чтобы создать вторую регистрацию приложения, которая будет служить регистрацией вашего приложения на основе холста.
Добавьте идентификатор регистрации приложения на основе холста в регистрацию приложения аутентификации.
Добавление URL-адреса обмена токенами
Чтобы обновить настройки аутентификации Microsoft Entra ID в Copilot Studio, вам необходимо добавить URL-адрес обмена токенами, чтобы разрешить вашему приложению и Copilot Studio обмениваться информацией.
На портале Azure в колонке регистрации приложения аутентификации перейдите по ссылке Предоставление API.
В разделе Области выберите значок Копировать в буфер обмена.
В меню навигации Copilot Studio в разделе Параметры выберите Безопасность, а затем выберите плитку Аутентификация.
Для URL-адреса обмена токенами (требуется для SSO) вставьте область, которую вы скопировали ранее.
Выберите Сохранить.
Настройка регистрации приложения на основе холста
После создания регистрации приложения на основе холста перейдите на страницу Аутентификация, затем выберите Добавить платформу.
В Конфигурации платформы выберите Добавить платформу, затем выберите Интернет.
В разделе URI перенаправления введите URL-адрес своей веб-страницы, например, http://contoso.com/index.html.
В разделе Потоки неявного предоставления и гибридные потоки включите оба маркера Маркеры доступа (используются для неявных потоков) и Маркеры идентификаторов (используемые для неявных и гибридных потоков).
Выберите Настроить.
Найдите URL-адрес конечной точки токена вашего помощника
В Copilot Studio откройте ваш помощник и выберите Каналы.
Выберите Мобильное приложение.
В разделе Конечная точка токена выберите Копировать.
Настройка единого входа на веб-странице
Используйте код, который можно найти в репозитории GitHub Copilot Studio, для создания веб-страницы для URL-адреса перенаправления. Скопируйте код из репозитория GitHub и измените его, следуя следующим инструкциям.
Заметка
Код в репозитории GitHub требует, чтобы пользователь выбрал кнопку входа или выполнил вход с другого сайта. Чтобы включить автоматический вход, добавьте следующий код в начало 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 =
Перейдите на страницу Обзор на портале Azure и скопируйте Идентификатор приложения (клиента) и Идентификатор каталога (клиента) из регистрации приложения на основе холста.
Чтобы настроить Библиотеку проверки подлинности Майкрософт (MSAL):
Назначьте clientId своему ИД приложения (клиента).
Назначьте authority адресу https://login.microsoftonline.com/ и добавьте в конце ИД каталога (арендатора).
Например:
var clientApplication;
(function (){
var msalConfig = {
auth: {
clientId: '00001111-aaaa-2222-bbbb-3333cccc4444',
authority: 'https://login.microsoftonline.com/7ef988bf-xxxx-51af-01ab-2d7fd011db47'
},
Задайте для переменной theURL URL-адрес конечной точки токена, который вы скопировали ранее. Например:
(async function main() {
var theURL = "https://<token endpoint URL>"
Измените значение userId так, чтобы оно включало в себя пользовательский префикс. Например:
Тестирование помощника с использованием веб-страницы
Откройте свою веб-страницу в браузере.
Выберите Войти.
Заметка
Если ваш браузер блокирует всплывающие окна или вы используете окно браузера в режиме инкогнито или частного просмотра, вам будет предложено войти в систему. В противном случае вход выполняется с использованием кода проверки.
Открывается новая вкладка браузера.
Перейдите на новую вкладку и скопируйте проверочный код.
Вернитесь на вкладку со своим помощником и вставьте код проверки в разговор с помощником.
Copilot Studio отправляет запрос на вход в систему, чтобы пользователь мог войти в систему с помощью своего настроенного поставщика удостоверений.
Пользовательский холст помощника перехватывает приглашение на вход и запрашивает токен от имени (OBO) от Microsoft Entra ID. Холст отправляет токен помощнику.
При получении токена OBO помощник обменивает токен OBO на «маркер доступа» и заполняет переменную AuthToken, используя значение маркера доступа. Переменная IsLoggedIn также устанавливается в это время.
Создайте регистрацию приложения в Microsoft Entra ID для пользовательского холста
Чтобы включить систему единого входа, вам потребуются две отдельные регистрации приложений:
Один для вашего пользовательского холста, чтобы включить SSO.
Важно
Вы не можете повторно использовать одну и ту же регистрацию приложения как для аутентификации пользователя вашего помощника, так и для вашего пользовательского холста.
Создание регистрации приложения для холста помощника
Перейдите к регистрациям приложений, либо выбрав значок, либо выполнив поиск в верхней панели поиска.
Выберите Создать регистрацию.
Введите имя регистрации. Может быть полезно использовать имя помощника, холст которого вы регистрируете, и включить "холст", чтобы помочь отделить его от регистрации приложения для аутентификации.
Например, если ваш помощник называется "Справка по продажам Contoso" (Contoso sales help), вы можете назвать регистрацию приложения как "ContosoSalesCanvas" или что-то подобное.
В разделе Поддерживаемые типы учетных записей выберите Учетные записи в клиенте организации (любой каталог Microsoft Entra ID — с несколькими клиентами) и личные учетные записи Microsoft (например, Skype, Xbox).
Оставьте раздел URI перенаправления пока пустым, так как вы вводите эту информацию на следующих шагах. Выберите Зарегистрировать.
После завершения регистрации она открывается для странице Обзор. Перейдите к Манифест. Подтвердите, что accessTokenAcceptedVersion задано как 2. Если это не так, измените его на 2, а затем выберите Сохранить.
Добавление URL-адреса перенаправления
При открытой регистрации перейдите в Аутентификация, а затем выберите Добавить платформу.
В колонке Настройка платформ выберите Интернет.
В разделе URI-адреса перенаправления добавьте полный URL-адрес на страницу, где размещен ваш холст чата. В разделе Неявное предоставление разрешения выберите флажки Токены идентификации и Токены доступа.
Выберите Настроить, чтобы подтвердить изменения.
Перейти к пункту Разрешения API. Выберите Предоставить согласие администратора для <имя вашего клиента>, затем Да.
Внимание
Чтобы пользователи не давали согласие на каждое приложение, глобальный администратор, администратор приложений или администратор облачного приложения должен предоставлять согласие в рамках всего клиента для регистрации вашего приложения.
Определите настраиваемую область действия для вашего помощника
Определите пользовательскую область, предоставив API для регистрации приложения на основе холста в рамках регистрации приложения аутентификации. Области позволяют определять роли пользователя и администратора и права доступа.
Этот шаг создает отношение доверия между регистрацией приложения аутентификации для аутентификации и регистрацией приложения для вашего пользовательского холста.
Перейдите к пункту Разрешения API и убедитесь, что для вашего помощника добавлены правильные разрешения. Выберите Предоставить согласие администратора для <имя вашего клиента>, затем Да.
Внимание
Чтобы пользователи не давали согласие на каждое приложение, глобальный администратор, администратор приложений или администратор облачного приложения должен предоставлять согласие в рамках всего клиента для регистрации вашего приложения.
Перейдите к пункту Предоставление API и выберите Добавить область.
Введите имя области и информацию, которая должна отображаться пользователям, когда они переходят на экран единого входа. Выберите Добавить область.
Выберите Добавить клиентское приложение.
Введите Идентификатор приложения (клиента) со страницы Обзор для регистрации приложения на основе холста в поле Идентификатор клиента. Установите флажок для указанной области, которую вы создали.
Выберите Добавить приложение.
Настройка проверки подлинности в Copilot Studio для включения SSO
URL-адрес обмена токенами на странице конфигурации аутентификации Copilot Studio используется для обмена токена OBO на запрошенный маркер доступа через платформу ботов bot framework.
Copilot Studio вызывает Microsoft Entra ID для осуществления фактического обмена.
Выполните вход в Copilot Studio.
Проверьте, что вы выбрали помощник, для которого вы хотите включить аутентификацию, выбрав значок помощника в верхнем меню и выбрав правильный помощник.
В меню навигации в разделе Параметры выберите Безопасность. Затем выберите карточку Аутентификация.
Введите полный URI области из колонки Предоставление API для регистрации приложения аутентификации помощника в поле URL-адрес обмена токенами. URI-адрес канала в формате: api://1234-4567/scope.name.
Выберите Сохранить, затем опубликуйте содержимое помощника.
Настройте HTML-код настраиваемого холста, чтобы включить SSO
Обновите страницу пользовательского холста, на которой находится помощник, чтобы перехватить запрос карточки входа и обменять токен OBO.
Настройте библиотеку Microsoft Authentication Library (MSAL), добавив следующий код в тег <script> в разделе <head>.
Обновите clientId, указав Идентификатор приложения (клиента) для регистрации приложения на основе холста. Замените <Directory ID> на Идентификатор каталога (клиента). Вы получаете эти идентификаторы со страницы Обзор для регистрации приложения холста.
<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>
Вставьте следующей тег <script> в раздел <body>. Этот скрипт вызывает метод для извлечения 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>
Вставьте следующей тег <script> в раздел <body>. В методе main этот код добавляет условие к вашему store, с уникальным идентификатором вашего помощника. Он также генерирует уникальный идентификатор как вашу переменную userId.
Обновите <COPILOT ID>, указав идентификатор вашего помощника. Вы можете увидеть идентификатор своего помощника, перейдя на вкладку "Каналы" для бота, который вы используете, и выбрав Мобильное приложение на портале 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>
Полный пример кода
Для получения дополнительной информации вы можете найти полный пример кода с MSAL и сохранить условные сценарии, которые уже включены в нашем репозитории GitHub.