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

问题描述 投票:1回答:1

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

以下是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

c# azure azure-functions claims-based-identity
1个回答
0
投票

这个问题是由于18年夏天发生的突然变化引起的,正如the GitHub thread所指出的那样。

以下是解决此问题的解决方法:

摘要

对于在2018年中期之后启用EasyAuth的应用程序,应用服务身份验证/授权功能对X-ZUMO-AUTH令牌行为进行了重大更改。这一突破性变化将在未来几周内恢复。

解决方法

同时,如果您希望dev应用程序行为与生产应用程序的行为相匹配,则可以通过删除站点auth设置中的“runtimeVersion”属性来实现。您可以使用以下内容执行此操作。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.