【问题标题】:Why is the 'identityProvider' claim missing in the ClaimsPrincipal running in an Azure Function v2?为什么在 Azure Function v2 中运行的 ClaimsPrincipal 中缺少“identityProvider”声明?
【发布时间】:2019-03-10 21:17:51
【问题描述】:

我有一个部署在 2 个环境中的 Azure Function App,一个用于开发,一个用于生产,每个环境都有自己的 URL。

在这两种环境中,功能都配置为允许用户使用他们的 Facebook 帐户进行身份验证。我实际上配置了 2 个不同的 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 声明来识别连接的用户,如以下日志所示:

问题出现在开发环境中。出于某种原因,我得到一个数字为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 声明,并且 ClaimsPrincipal 实例中的 nameidentifier 声明与 JWT 不同。

目前,作为一种解决方法,我只是使用 JWT 来提取 sid,但我宁愿让框架为我提供这个。

更新 2

我已以issue on github 的身份打开此邮件。

【问题讨论】:

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


    【解决方案1】:

    该问题是由 the GitHub thread 中指定的 18 年夏季发生的重大变化引起的。

    以下是解决方法:

    总结

    应用服务身份验证/授权功能取得突破 更改启用 EasyAuth 的应用程序的 X-ZUMO-AUTH 令牌行为 2018 年年中之后。在接下来的几年中,这一重大变化将被恢复 周。

    解决方法

    与此同时,如果您希望您的开发应用程序行为匹配 您的生产应用程序的行为,您可以通过删除 站点身份验证设置中的“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”添加一个值,您将拥有 再次按照上述步骤将其删除。

    【讨论】:

    • 应该为专用功能应用程序部署此修复程序,因此希望不再需要解决方法。如果不是这样,请告诉我。
    • @ConnorMcMahon 感谢您的帮助! :)
    猜你喜欢
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2019-02-27
    • 2021-08-06
    • 2017-04-01
    • 1970-01-01
    • 2020-02-13
    相关资源
    最近更新 更多