我有一个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
}
以下是Production环境中的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。
这个问题是由于18年夏天发生的突然变化引起的,正如the GitHub thread所指出的那样。
以下是解决此问题的解决方法:
摘要
对于在2018年中期之后启用EasyAuth的应用程序,应用服务身份验证/授权功能对
X-ZUMO-AUTH
令牌行为进行了重大更改。这一突破性变化将在未来几周内恢复。解决方法
同时,如果您希望dev应用程序行为与生产应用程序的行为相匹配,则可以通过删除站点auth设置中的“runtimeVersion”属性来实现。您可以使用以下内容执行此操作。
- 导航到https://resources.azure.com/
- 通过侧面的下拉菜单,导航到
subscriptions > (subName) > resourceGroups > (resourceGroupName) > providers > Microsoft.Web > sites > (siteName) > config > authSettings
。- 编辑属性下的
json
对象,并将runtimeVersion
设置为“”。- 使用PUT操作进行这些更改。
- 如果这些步骤成功,您应该会在应用程序中看到
runtimeVersion
不再存在。注意:如果您在任何时候禁用然后重新启用身份验证/授权,它将为“
runtimeVersion
”添加一个值,您将不得不再次按照上述步骤将其删除。