У меня есть приложение-функция 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 *
Проблема появляется в среде разработки. По какой-то причине я получаю число как nameidentifier
(вместо шестнадцатеричного числа, начинающегося с sid:
), а identityprovider
вообще отсутствует в претензиях:
Вопрос
Что может быть причиной того, что 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 .