Почему утверждение «identityProvider» отсутствует в ClaimsPrincipal, работающем в функции Azure v2? - PullRequest
1 голос
/ 11 марта 2019

У меня есть приложение-функция Azure, которое развернуто в 2 средах: одна для разработки и одна для производства, каждая со своим собственным URL.

В обеих средах функции настроены так, чтобы пользователи могли проходить аутентификацию с использованием своей учетной записи Facebook. Я на самом деле настроил 2 разных приложения Facebook: одно для среды разработки и одно для среды производства.

Вот код одной функции Azure, которая просто регистрирует в Application Insights все заголовки HTTP-запроса, а также все утверждения введенного экземпляра ClaimsPrincipal:

public sealed class FindAccountFunction
{
    private readonly ILogger m_logger;

    public FindAccountFunction(ILoggerFactory loggerFactory)
    {
        m_logger = loggerFactory.CreateLogger<FindAccountFunction>();
    }

    [FunctionName("FindAccount")]
    public async Task<IActionResult> Run(
            [HttpTrigger(
                AuthorizationLevel.Function,
                "get",
                Route = "v1/accounts"
            )]
            HttpRequest httpRequest,
            ClaimsPrincipal claimsPrincipal)
     {
         // Logs all Headers of the httpRequest
         // Logs all the claims of claimsPrincipal.

         return new OkObjectResult("Ok");
     }
}

Все отлично работает в производственной среде, потому что я могу определить подключенного пользователя, получив утверждения nameidentifier и identityprovider, как показано в следующих журналах:

* +1012 *Logs with stable_sid

Проблема появляется в среде разработки. По какой-то причине я получаю число как nameidentifier (вместо шестнадцатеричного числа, начинающегося с sid:), а identityprovider вообще отсутствует в претензиях:

Logs without stable_sid

Вопрос

Что может быть причиной того, что nameidentifier будет числом в среде разработки, а утверждение identityprovider отсутствует в экземпляре ClaimsPrincipal?

Есть ли какие-либо разрешения, которые могут отсутствовать?

Обновление

Я добавил параметр WEBSITE_AUTH_HIDE_DEPRECATED_SID и установил его на true в обеих средах.

Вот токен JWT из среды разработки:

{
  "sub": "sid:a3xxxxxxxxxxxxx",
  "idp": "facebook",
  "ver": "4",
  "iss": "https://dev.company.ca/",
  "aud": "https://dev.company.ca/",
  "exp": 1557524710,
  "nbf": 1552343212
}

Вот токен JWT из производственной среды:

{
  "sub": "sid:06afxxxxxxxx",
  "idp": "facebook",
  "ver": "4",
  "iss": "https://prod.company.ca/",
  "aud": "https://prod.company.ca/",
  "exp": 1557526156,
  "nbf": 1552342494
}

Тем не менее, среда разработки не предоставила ожидаемую заявку identityprovider, и заявка nameidentifier в экземпляре ClaimsPrincipal отличается от заявки JWT.

Пока что, в качестве обходного пути, я просто использую JWT для извлечения sid, но я бы предпочел каркас, чтобы предоставить мне это.

Обновление 2

Я открыл это как проблему на github .

1 Ответ

0 голосов
/ 20 апреля 2019

Проблема вызвана критическим изменением, которое произошло летом 18 года, как указано в потоке GitHub .

Вот обходной путь, чтобы исправить это:

Резюме

Функция аутентификации / авторизации службы приложений сделала прорыв изменить поведение токена X-ZUMO-AUTH для приложений, которые включили EasyAuth после середины 2018 года. Это серьезное изменение возвращается в следующие несколько недель.

Обход

В то же время, если вы хотите, чтобы поведение вашего dev-приложения совпадало поведение вашего производственного приложения, вы можете сделать это, удалив Свойство runtimeVersion в настройках авторизации вашего сайта. Вы можете сделать это со следующим.

  1. Перейдите к https://resources.azure.com/
  2. В раскрывающемся меню сбоку перейдите к subscriptions > (subName) > resourceGroups > (resourceGroupName) > providers > Microsoft.Web > sites > (siteName) > config > authSettings.
  3. Измените объект json в свойствах и установите runtimeVersion на "".
  4. Используйте операцию PUT для внесения этих изменений.
  5. Если эти шаги были успешными, вы должны увидеть, что runtimeVersion больше не присутствует в вашем приложении.

ПРИМЕЧАНИЕ. Если вы отключите, а затем снова включите Аутентификацию / Авторизацию на в любой момент, это добавит значение для "runtimeVersion", и вы будете иметь повторите описанные выше шаги, чтобы удалить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...