Авторизация SPA для API
У нас есть 5 порталов REACT и 1 API Asp:net Core 3.1. Мы хотели бы использовать один и тот же API для всех порталов. Все они авторизуются через MSAL B2B (react-aad-msal). Сначала я пытаюсь использовать один портал для работы с одним API. Для этого у меня есть два реестра приложений (AccountRequestPortal и AccountAPI).
Приложение Reg AccountRequestPortal:
AccountAPI:
Обратите внимание, я предоставил порталу доступ к API.
Конфигурация API:
// Portal
const msalConfig = {
auth: {
authority: 'https://login.microsoftonline.com/a364eb28-xxx-5b4f7767ad84',
clientId: '03099206-xxx-e31a9ee8dec5',
redirectUri: redirectUri
},
cache: {
cacheLocation: "localStorage",
storeAuthStateInCookie: true
}
};
const authParameters = {
scopes: [
"api://03099206-xxx-e31a9ee8dec5/Read"
]
}
// API
// const msalConfig = {
// auth: {
// authority: 'https://login.microsoftonline.com/a364eb28-e95b-4ad0-a4fb-5b4f7767ad84',
// clientId: '422132b5-xxx-6651f01a1109',
// redirectUri: redirectUri
// },
// cache: {
// cacheLocation: "localStorage",
// storeAuthStateInCookie: true
// }
// };
// const authParameters = {
// scopes: [
// "api://422132b5-xxx-6651f01a1109/Read"
// ]
// }
Настройки приложения API:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
//API
"AzureAd": {
"ApplicationIdUri": "api://422132b5-xxx-6651f01a1109",
"Authority": "https://login.microsoftonline.com/a364eb28-xxx-5b4f7767ad84/v2.0",
"AuthorizationUrl": "https://login.microsoftonline.com/a364eb28-xxx-5b4f7767ad84/oauth2/v2.0/authorize",
"Instance": "https://login.microsoftonline.com/",
"ClientId": "422132b5-xxx-6651f01a1109",
"Domain": "a364eb28-xxx-5b4f7767ad84",
"TenantId": "a364eb28-xxx-5b4f7767ad84"
}
//PORTAL
//"AzureAd": {
// "ApplicationIdUri": "api://03099206-xxx-e31a9ee8dec5",
// "Authority": "https://login.microsoftonline.com/a364eb28-xxx-5b4f7767ad84/v2.0",
// "AuthorizationUrl": "https://login.microsoftonline.com/a364eb28-xxx-5b4f7767ad84/oauth2/v2.0/authorize",
// "Instance": "https://login.microsoftonline.com/",
// "ClientId": "03099206-xxx-e31a9ee8dec5",
// "Domain": "a364eb28-xxx-5b4f7767ad84",
// "TenantId": "a364eb28-xxx-5b4f7767ad84"
//}
}
Если я решу использовать только одну и ту же регистрацию приложения для бота, API и портал, все будет работать. Однако, если я решу разделить API и портал на два AppReg, я получаю 401. Даже если я предоставил доступ к AppReg портала к ApiReg, я что-то упустил?
1 ответ
Судя по вашему описанию, вы хотите использовать клиентское приложение. AccountRequestPortal
вызвать APIAccountAPI
.
Если это так, вам необходимо раскрыть область API в AccountAPI
приложение, а не AccountRequestPortal
приложение. Затем вAccountRequestPortal
приложение -> API permissions
-> добавить разрешение API, предоставленное AccountAPI
-> предоставить согласие администратора, как я вижу, вы сделали наоборот, это неправильно.
На скриншоте application id
из AccountRequestPortal
является 03099206-xxx-e31a9ee8dec5
, AccountAPI
является 422132b5-xxx-6651f01a1109
, если да, то конфигурация должна быть:
const msalConfig = {
auth: {
authority: 'https://login.microsoftonline.com/a364eb28-xxx-5b4f7767ad84',
clientId: '03099206-xxx-e31a9ee8dec5',
redirectUri: redirectUri
},
cache: {
cacheLocation: "localStorage",
storeAuthStateInCookie: true
}
};
const authParameters = {
scopes: [
"api://422132b5-xxx-6651f01a1109/Read"
]
}
Параметры app.settings должны быть:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"AzureAd": {
"ApplicationIdUri": "api://422132b5-xxx-6651f01a1109",
"Authority": "https://login.microsoftonline.com/a364eb28-xxx-5b4f7767ad84/v2.0",
"AuthorizationUrl": "https://login.microsoftonline.com/a364eb28-xxx-5b4f7767ad84/oauth2/v2.0/authorize",
"Instance": "https://login.microsoftonline.com/",
"ClientId": "03099206-xxx-e31a9ee8dec5",
"Domain": "a364eb28-xxx-5b4f7767ad84",
"TenantId": "a364eb28-xxx-5b4f7767ad84"
}
}