【发布时间】:2019-03-10 21:17:51
【问题描述】:
我有一个部署在 2 个环境中的 Azure Function App,一个用于开发,一个用于生产,每个环境都有自己的 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 声明来识别连接的用户,如以下日志所示:
问题出现在开发环境中。出于某种原因,我得到一个数字为nameidentifier(而不是一个以sid: 开头的十六进制数字),而声明中完全缺少identityprovider:
问题
什么会导致 nameidentifier 成为开发环境中的数字,而 identityprovider 声明在 ClaimsPrincipal 实例中丢失?
是否有可能缺少的权限?
更新
我已添加 setting 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 声明,并且 ClaimsPrincipal 实例中的 nameidentifier 声明与 JWT 不同。
目前,作为一种解决方法,我只是使用 JWT 来提取 sid,但我宁愿让框架为我提供这个。
更新 2
我已以issue on github 的身份打开此邮件。
【问题讨论】:
标签: c# azure azure-functions claims-based-identity