В моем бэкэнде службы приложений Azure .NET я обычно украшаю свои контроллеры с помощью [authorize], чтобы они были защищены от пользователей, которые не вошли в систему. Для аутентификации пользователя я настроил клиента Azure Active Directory B2C (AADB2C),настроил приложение, а также некоторых поставщиков удостоверений, и все работает как положено, пока я размещаю свой бэкэнд в Azure.
Теперь я хотел бы иметь возможность запускать бэкэнд локально, чтобы я мог легкоотладить код и заставить его работать с локальной базой данных разработки.
Однако это не работает.
- Я перешел на https://[myappservice].scm.azurewebsites.net/ и получил WEBSITE_AUTH_SIGNING_KEY на вкладке среды.
- Я добавил ключ к web.config моего бэкэнда как Signingkey в AppSettings
- Я изменил ValidAudience и ValidIssuer на соответствующие значения(https://[myappservice].azurewebsites.net)
- Чтобы я мог связать бэкэнд с IP-адресом или именем моего хоста, а не с «localhost» (как в случае с IIS Express), я настроил бэкэнд для работы под IIS
- Я разрешил анонимный доступ только на своем веб-сайте IIS и позволил ему работать под DefaultAppPool, который использует интегрированный конвейер на 4.0 CLR
Мой код клиента не использует MobileServiceClient, но MSAL (PublicClientApplicationТаким образом, документация о том, как настроить локальную среду разработки, найденную здесь , не применима.
Поскольку у меня есть класс RequestProvider, который создает необходимый HttpClи добавляет токен доступа в заголовок, это не должно быть проблемой, потому что для аутентификации объект PublicClientApplication использует клиента AADB2C и соответствующие политики потоков сервера для входа в систему и -up, а также для вызова контроллера покоя бэкэнда Iможет переключаться между хостом Azure и локально размещенным бэкэндом.
Однако, хотя аутентификация продолжает работать как чудо, и я могу получить рабочий токен доступа, бэкэнд, размещенный локально, не принимает его, покатот же бэкэнд-код, размещенный на Azure.
Итак, я начал искать в сети и узнал о сайте jwt.io .Я вставил свой токен доступа в их декодер и был удивлен результатом.
В некоторых статьях упоминалось, что значения ValidIssuer и ValidAudience настроены в web.config бэкэндовнеобходимо точно отражать значения iss и aud , содержащиеся в маркере доступа.
Однако значения в my token access не совпадаютхотя схема, которая была частью шаблона web.config (https://[myappservice].azurewebsites.net).
Поле iss в my декодированном токене, выглядело так:
https://[myappservice].b2clogin.com/12345678-1234-1234-1234-123456789012/v2.0/
Поле aud в my декодированном токене выглядело так:
12345678-1234-1234-1234-123456789012
Значение isser можно найти в моих AADb2C арендаторахкаталог в настройках политики входа / -up в Свойствах в «Настройках совместимости токенов» от имени Заявка эмитента (iss) .которого выбрано следующее значение:
https://<domain>/12345678-1234-1234-1234-123456789012/v2.0/
aud guid полей равен идентификатору клиента , настроенному в службе приложений в Azure.
Однако, даже если я возьму эти два значения и введу их в web.configкак описано выше, я все еще получаю сообщение об ошибке «Отказано в авторизации для этого запроса».
Я действительно не знаю, как заставить это работать ...