У меня есть локальный клиент SPA (на основе https://docs.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-javascript-spa)
Затем есть служба WebAPI. (На основе https://github.com/Azure-Samples/active-directory-dotnet-native-desktop)
Служба должна отвечать только аутентифицированным и авторизованным клиентамС этой целью я использую активный каталог Azure (AD).
Здесь показано, как связаны 3 части. Номера относятся к порядку вызовов.
![enter image description here](https://i.stack.imgur.com/gM9TM.png)
Хотя Azure AD, похоже, возвращает клиенту токен доступа, и клиент отправляет токен доступа к службе в заголовке, служба отвечает
Authorization has been denied for this request
Вопрос Почему это происходит? У меня такое ощущение, что моя локально работающая служба почему-то «не разговаривает с Azure AD».
Подробности
И клиент, и служба являются «регистрациями приложений» в Azure AD.
![enter image description here](https://i.stack.imgur.com/2aVdq.png)
Служба предоставляет API.
![enter image description here](https://i.stack.imgur.com/AjChB.png)
В конфигурации сервиса есть «арендатор» и «аудитория»«Похоже, слишком мало конфигурации.
![enter image description here](https://i.stack.imgur.com/ijW7Z.png)
Клиент имеет разрешения API.
![enter image description here](https://i.stack.imgur.com/IxE90.png)
В конфигурации клиента есть идентификатор регистрации клиентского приложения.
![enter image description here](https://i.stack.imgur.com/ODTJJ.png)
Клиент, по сути, состоит из кнопки для входа и кнопки для получения списка задач из API.Ниже приведен снимок экрана клиента и инструментов разработчика Firefox со страницей входа.
![enter image description here](https://i.stack.imgur.com/wgtlw.png)
Когда клиент запускается, мне сначала нужно пройти аутентификацию с помощью AzureОБЪЯВЛЕНИЕ.Клиент получает токен доступа.Ниже ответ.
![enter image description here](https://i.stack.imgur.com/fGX5U.png)
Когда я нажимаю «Get Todos», служба вызывается с токеном доступа, но ответ 401.
![enter image description here](https://i.stack.imgur.com/1KdR9.png)
Код для получения списка задач
function getTodos() {
myMSALObj.acquireTokenPopup(requestObj).then(function (tokenResponse) {
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
console.log("success");
} else {
console.log("failure");
}
}
const apiUrl = "https://localhost:44321/api/todolist";
xmlHttp.open("GET", apiUrl, true); // true for asynchronous
//No, the API sends back this header (to indicate that cross origin requests are allowed). xmlHttp.setRequestHeader('Access-Control-Allow-Origin', 'Bearer ' + tokenResponse.accessToken);
xmlHttp.setRequestHeader('Authorization', 'Bearer ' + tokenResponse.accessToken);
xmlHttp.send();
}).catch(function (error) {
console.log(error);
});
}