#c# #asp.net #angular #azure #azure-ad-b2c
Вопрос:
У меня есть приложение Angular и приложение веб-Api (.Net 5.0), и мне нужно, чтобы пользователь прошел проверку подлинности с помощью Azure AD B2C. Таким образом, когда пользователю нужно добраться до какого-либо защищенного маршрута, он будет перенаправлен на страницу входа в систему B2C, аутентифицирован и перенаправлен обратно в приложение angular. Эта угловая часть работает, здесь нет проблем.
Теперь, когда приложение Angular отправляет запрос к защищенному веб-API (.Net 5), этот веб-api должен авторизовать запрос. Я делал это раньше в предыдущих версиях .Net Core. Но это новый и блестящий веб-сайт Microsoft Identity. И это не работает.
Настройка
appsettings.json для B2C
"AzureAdB2C": {
"TenantId": "[Tenant Guid]",
"Instance": "https://[tenant name].b2clogin.com/",
"ClientId": "[web api client Id]",
"Domain": "[tenant name].onmicrosoft.com",
"SignInPolicyId": "B2C_1_signin"
},
startup.cs — Службы конфигурации()
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(options =>
{
Configuration.Bind("AzureAdB2C", options);
options.TokenValidationParameters.NameClaimType = "name";
},
options => { Configuration.Bind("AzureAdB2C", options); });
// Creating policies that wraps the authorization requirements
services.AddAuthorization();
services.AddApplication();
services.AddInfrastructure(Configuration);
services.AddRouting(options => options.LowercaseUrls = true);
services.AddMemoryCache();
services.AddControllers().AddNewtonsoftJson();
startup.cs — Настройка()
...
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
// endpoints.MapRazorPages();
endpoints.MapControllers();
});
При такой настройке все, что я получаю, — это очень описательная ошибка:
Система.Исключение InvalidOperationException: IDX20803: Не удалось получить конфигурацию из: ‘Системы.Строка’. —> Исключение System.IO.IOException: IDX20807: Не удается извлечь документ из: ‘Системы.Струна». HttpResponseMessage: «System.Net.Http.HttpResponseMessage», HttpResponseMessage.Содержание: «Система.Струна». в Microsoft.Идентификационная модель.Протоколы.HttpDocumentRetriever.GetDocumentAsync(строковый адрес, отмена или отмена) в Microsoft.Идентификационная модель.Протоколы.OpenIdConnect.OpenIdConnectConfigurationRetriever.GetAsync(строковый адрес, повторный вызов IDocumentRetriever, отмена, отмена) в Microsoft.Идентификационная модель.Протоколы.ConfigurationManager
1.GetConfigurationAsync(CancellationToken cancel) --- End of inner exception stack trace --- at Microsoft.IdentityModel.Protocols.ConfigurationManager
1.GetConfigurationAsync(отмена или отмена) в Microsoft.AspNetCore.Идентификация.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync() в Microsoft.AspNetCore.Идентификация.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync() в Microsoft.AspNetCore.Идентификация.Обработчик аутентификации`1.AuthenticateAsync() в Microsoft.AspNetCore.Идентификация.Служба аутентификации.AuthenticateAsync(контекст HttpContext, строковая схема) в Microsoft.AspNetCore.Идентификация.Аутентификационное программное обеспечение.Вызовите(контекст HttpContext) в Microsoft.AspNetCore.Локализация.RequestLocalizationMiddleware.Вызовите(контекст HttpContext) в Microsoft.AspNetCore.Диагностика.DeveloperExceptionPageMiddleware.Вызов(контекст HttpContext)
Но затем я изменил эту «вспомогательную» конфигурацию сахара на следующую:
services.AddAuthentication(options => { options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; })
.AddJwtBearer(jwtOptions =>
{
jwtOptions.Authority = $"{Configuration["AzureAdB2C:Instance"]}/{Configuration["AzureAdB2C:TenantId"]}/{Configuration["AzureAdB2C:SignInPolicyId"]}/v2.0/";
jwtOptions.Audience = Configuration["AzureAdB2C:ClientId"];
jwtOptions.Events = new JwtBearerEvents
{
OnAuthenticationFailed = AuthenticationFailed
};
});
И это работает!
Итак, есть ли хорошая документация о том, КАК на самом деле должна быть настроена MS Identity Web? Почему в исключении нет точного описания, рассказывающего, чего именно не хватает?
Обновить
Спасибо за ответ, но эта веб-реализация идентификации действительно оставляет желать лучшего.
Причина этого исключения либо SignUpSignInPolicyId
не определена, либо написана с ошибкой! Команда Microsoft, вы должны добавить его в свое исключение!
- Добавьте значимые исключения
- Если я не хочу использовать политику регистрации (мне не нужно, чтобы кто-то посторонний заходил и регистрировался в моем приложении), почему это не задокументировано и не поддерживается?
- Используйте необязательное ведение журнала, которое сообщит разработчику, что не так/отсутствует!
- используйте шаблон конструктора для создания конфигурации. Тогда должно быть легче определить, какая часть конфигурации отсутствует в конкретном случае.
Комментарии:
1. Исключение указывает, что вы можете достичь конечной точки метаданных OIDC. Этот URL-адрес создается с использованием полномочий, которые создаются с использованием экземпляра, идентификатора пользователя и идентификатора политики. По какой-то причине похоже, что конфигурация по умолчанию не может создать/извлечь этот URL-адрес.
2. Это последний документ, на который следует ссылаться: docs.microsoft.com/en-us/azure/active-directory-b2c/…
3. 1) один пример — это не сработает, для начала сервисы. AddMicrosoftIdentityWebAppAuthentication(Конфигурация, «AzureAdB2C»); 2) «исключение указывает, что вы можете достичь конечной точки метаданных OIDC» — ДЕЙСТВИТЕЛЬНО? Куда? покажите мне это в тексте исключения. 3) Почему это просто не может сказать мне, какой части не хватает?
4. Я чувствую вашу боль от
Microsoft.Identity.Web
того , что документация и поддержка не просто плохи, особенно для .Net 5.0.
Ответ №1:
Измените идентификатор SignInPolicyId в настройках приложения.json на идентификатор SignUpSignInPolicyId
Комментарии:
1. Мне не нужна политика регистрации — я не хочу, чтобы какой-либо пользователь заходил и регистрировался в моем приложении! Мне нужна только политика входа в систему.
2. Дело не в этом, важно имя ключа. Он используется для создания URL-адреса метаданных OIDC, это не означает, что вам нужна или будет доступна возможность регистрации.
3. Зачем вообще нужна политика регистрации/входа в систему?! это API, А НЕ КЛИЕНТ.
4. Это связано с тем, что он является частью полномочий в AAD B2C, для создания URL-адреса метаданных OIDC, на котором размещены ключи подписи токенов, должен быть идентификатор политики. SUSI является наиболее распространенным, отсюда и название ключа.
5. @JasSuri-MSFT, Это ссылка на политику, которая использовалась для выпуска токена в первую очередь? Таким образом, аутентификация фактически не выполняется, это исключительно для проверки самого токена?