我有一个Azure功能应用程序,该应用程序部署在2个环境中,一个用于开发,一个用于生产,每个环境都有自己的URL。
在两种环境中,功能均配置为使用户能够使用其Facebook帐户进行身份验证。我实际上配置了两个不同的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
声明,并且nameidentifier
实例中的ClaimsPrincipal
声明不同于JWT的声明。
目前,作为一种解决方法,我仅使用JWT提取sid
,但我希望有一个框架可以为我提供此功能。
更新2
我以issue on github的身份打开了它。
答案 0 :(得分:0)
问题是由the GitHub thread中指定的'18年夏季发生的重大更改引起的。
以下是解决方法:
摘要
App Service身份验证/授权功能出现了问题 已启用EasyAuth的应用的
X-ZUMO-AUTH
令牌行为的更改 在2018年中之后。在接下来的数年中,这一重大变化将被恢复 周。解决方法
同时,如果您希望开发应用程序的行为与之匹配 生产应用程序的行为,可以通过删除 网站身份验证设置中的“ runtimeVersion”属性。你可以这样 与以下内容。
- 导航到https://resources.azure.com/
- 通过侧面的下拉菜单,导航至
subscriptions > (subName) > resourceGroups > (resourceGroupName) > providers > Microsoft.Web > sites > (siteName) > config > authSettings
。- 在属性下编辑
json
对象,并将runtimeVersion
设置为“”。- 使用PUT操作进行更改。
- 如果这些步骤成功完成,您应该会看到
runtimeVersion
不再存在于您的应用程序中。注意:如果在以下位置禁用然后重新启用身份验证/授权 在任何时候,它将为“
runtimeVersion
”添加一个值,您将拥有 再次按照上述步骤将其删除。