Я чувствую, что этот вопрос задавали несколько раз раньше, но я не понимаю и не узнаю, что мне нужно знать.
У меня есть Azure AD с двумя арендаторами. В арендаторе 1 есть все наши пользователи. Клиент 2 предназначен для внешних пользователей, выполняющих входящие вызовы API — сейчас мы находимся на стадии проверки концепции.
Все отлично работает, когда я настраиваю новых пользователей в арендаторе 2. Создаются пользователи, создается приложение, определяются области API и, наконец, с помощью корпоративного приложения создаются роли с локальными пользователями, назначенными ролям. Приложение .Net Core украшено [Authenticate Roles("Read, Write"] и т. д. Затем области проверяются с помощью HttpContext.VerifyUserHasAnyAcceptedScope(scopeRequiredByApi); внутри каждого метода контроллера. Как я уже сказал, все это прекрасно работает с пользователями которые были определены как локальные пользователи в арендаторе 2.
Если это поможет, мы используем Postman для тестирования.
Однако если я изменю вызов входа в систему, чтобы просто использовать гостевого пользователя, который является существующим пользователем в клиенте Azure AD 1, я наблюдаю следующее поведение. Пользователь проходит аутентификацию, и возвращается user_token, а также id_token. Вызов существующих методов API PUT и POST всегда возвращает ошибку 403 Forbidden. Я читал, что идентификатор гостя должен использовать auth_token, так что я сделал это, но безрезультатно.
Если у кого-нибудь есть какие-либо советы о том, где я должен искать, если я пропускаю что-то простое или если есть значение конфигурации, которое я не делаю, я бы хотел его услышать. Я понимаю, что у меня мало реальных фрагментов кода, но на самом деле их нет. API работает просто отлично, а вызов Postman отлично работает для локальных пользователей. Это просто гостевые пользователи, которым не назначена «правильная» роль.
РЕДАКТИРОВАТЬ - соответствующие биты файла appsettings.json:
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx",
"Domain": "tenant01.onmicrosoft.com", // the domain for tenant 1
"TenantId": "common"
},
И файл startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddMicrosoftIdentityWebApiAuthentication(Configuration);
services.AddControllers();
// some other code...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
Маркер аутентификации для гостевого пользователя показывает область действия, но роль отсутствует. Маркер идентификатора для гостевого пользователя просто показывает стандартные утверждения пользователя — имя, предпочитаемое_имя_пользователя, выдавший арендатор и т. д.
Мне не хватает чего-то, что, вероятно, не очень сложно настроить, но я понятия не имею, что делать дальше.
Я вызываю пользовательский API-вызов pocDemoApiAd, показанный на снимке экрана выше. Это простой REST API с методами GET, POST, PUT и DELETE.
Мы поняли это. Никаких изменений в код или файл json внесено не было. URL-адрес, используемый для вызова аутентификации, был изменен. URL-адрес, который был изменен с:
https://login.microsoftonline.com/oauth2/v2.0/токен
НА этот URL
https://login.microsoftonline.com/<tenantid>/oauth2/v2.0/token
Это изменение привело к тому, что роль появилась в id_token. Я читал, что необходимо использовать id_token, но я не знал об изменении, которое необходимо было внести в URL-адрес, чтобы включить идентификатор арендатора.
Какой API вы вызываете?