为什么在Azure Function v2中运行的ClaimsPrincipal中缺少'identityProvider'声明?

时间:2019-03-10 21:17:51

标签: c# azure azure-functions claims-based-identity

我有一个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");
     }
}

一切都可以在生产环境中很好地工作,因为我可以通过获取nameidentifieridentityprovider声明来识别连接的用户,如以下日志所示:

Logs with stable_sid

问题出现在开发环境中。由于某种原因,我得到一个数字nameidentifier(而不是以sid:开头的十六进制数字),并且identityprovider完全从声明中丢失:

Logs without stable_sid

问题

什么会导致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的身份打开了它。

1 个答案:

答案 0 :(得分:0)

问题是由the GitHub thread中指定的'18年夏季发生的重大更改引起的。

以下是解决方法:

  

摘要

     

App Service身份验证/授权功能出现了问题   已启用EasyAuth的应用的X-ZUMO-AUTH令牌行为的更改   在2018年中之后。在接下来的数年中,这一重大变化将被恢复   周。

     

解决方法

     

同时,如果您希望开发应用程序的行为与之匹配   生产应用程序的行为,可以通过删除   网站身份验证设置中的“ runtimeVersion”属性。你可以这样   与以下内容。

     
      
  1. 导航到https://resources.azure.com/
  2.   
  3. 通过侧面的下拉菜单,导航至subscriptions > (subName) > resourceGroups > (resourceGroupName) > providers > Microsoft.Web > sites > (siteName) > config > authSettings
  4.   
  5. 在属性下编辑json对象,并将runtimeVersion设置为“”。
  6.   
  7. 使用PUT操作进行更改。
  8.   
  9. 如果这些步骤成功完成,您应该会看到runtimeVersion不再存在于您的应用程序中。
  10.   
     

注意:如果在以下位置禁用然后重新启用身份验证/授权   在任何时候,它将为“ runtimeVersion”添加一个值,您将拥有   再次按照上述步骤将其删除。