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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么在Azure Function v2中运行的ClaimsPrincipal中缺少'identityProvider'声明?相关的知识,希望对你有一定的参考价值。

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

答案

这个问题是由于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”添加一个值,您将不得不再次按照上述步骤将其删除。

以上是关于为什么在Azure Function v2中运行的ClaimsPrincipal中缺少'identityProvider'声明?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Azure Function v2(核心)中静态使用 ConfigurationBuilder?

Visual Studio 2019 不会调试 Azure Function V2

Azure Blob Storage V2,来自 Azure Function App 的异常 API 调用,升级后

使用 Azure Function V2 Durable 函数时,ILogger 不记录到 Application Insights

Azure Function v2 引用了 Newtonsoft.Json 版本高于 Microsoft.NET.Sdk.Functions 的项目

我们可以在Azure Data Factory v2(ADFv2)复制活动中使用不同的运行时吗?