(продолжение вопроса: Почему мой SPA, который вызывает мой WebAPI, использует Azure Active Directory и получает сообщение "В этом запросе отказано в авторизации."? )
Мойклиент SPA пытается вызвать защищенный WebAPI (сервис).Клиент использует MSAL (библиотеки аутентификации Micosoft).Проблема возникает до вызова API, то есть на рисунке ниже где-то между 1 и 2.
Вот клиент
<!DOCTYPE html>
<html>
<head>
<title>Quickstart for MSAL JS</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bluebird/3.3.4/bluebird.min.js"></script>
<script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.2/js/msal.js"></script>
</head>
<body>
<div class="container">
<div>
<button id="GetTodos" onclick="getTodos()">Get Todos</button>
</div>
</div>
<script>
var msalConfig = {
auth: {
clientId: 'xxxxxxxxxxxxxxxxxxxxxxx2427',
authority: "https://login.microsoftonline.com/my.tenant"
},
cache: {
cacheLocation: "sessionStorage",
storeAuthStateInCookie: true
}
};
var requestObj = {
// scopes: ["user.read"]
scopes: ["access_as_user"]
};
var myMSALObj = new Msal.UserAgentApplication(msalConfig);
myMSALObj.handleRedirectCallback(authRedirectCallBack);
function getTodos() {
console.log("getTodos ...");
myMSALObj.loginPopup(requestObj)
.then(response => {
myMSALObj.acquireTokenPopup(requestObj).then(function (tokenResponse) {
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
console.log("success");
//this.responseText
} else {
console.log("failure");
}
}
const apiUrl = "https://localhost:44321/api/todolist";
xmlHttp.open("GET", apiUrl, true); // true for asynchronous
xmlHttp.setRequestHeader('Authorization', 'Bearer ' + tokenResponse.accessToken);
xmlHttp.send();
}).catch(function (error) {
console.log(error);
});
})
.catch(err => {
// handle error
console.log("login popup failed.", err);
});
}
function authRedirectCallBack(error, response) {
console.log('authRedirectCallBack');
if (error) {
console.log(error);
} else {
if (response.tokenType === "access_token") {
console.log("response.tokenType === access_token");
} else {
console.log("token type is:" + response.tokenType);
}
}
}
</script>
</body>
</html>
И клиент, и служба являются зарегистрированными приложениями в Azure Active Directory
Клиент имеет разрешения API для доступа к службе.
И сервис предоставляет API с областью доступа access_as_user
Однако вызов
myMSALObj.loginPopup(requestObj)
вызывает
ServerError: "AADSTS650053: The application 'ClientSPA' asked for scope 'access_as_user' that doesn't exist on the resource '00000003-0000-0000-c000-000000000000'.
И при использовании Chrome я получаю это сообщение
Дальнейшее расследование
Вместо того, чтобы запрашивать область действия «access_as_user», я спрашиваю «user.read». Это дает мне токен доступа.Но это заставляет WebAPI отвечать
Authorization has been denied for this request
И когда я декодирую токен доступа, я вижу, что аудитория равна https://graph.microsoft.com. Но я ожидаю, что аудитория будет «* 1059».* См. Рисунок ниже (запутанные строки содержат информацию, относящуюся к моему пользователю и моему зарегистрированному приложению)
Вопросы
Откуда берется идентификатор ресурса '00000003-0000-0000-c000-000000000000' (упоминается в сообщении об ошибке)?Это не идентификатор приложения ни клиента, ни сервиса.
Что я сделал неправильно, либо в конфигурации в Azure Active Directory, либо в клиенте?
Может ли CORS быть проблемой?Я настроил службу, чтобы разрешить CORS.