Azure Function App Binding ClaimsPrincial 不设置来自 JWT 的声明

Posted

技术标签:

【中文标题】Azure Function App Binding ClaimsPrincial 不设置来自 JWT 的声明【英文标题】:Azure Function App Binding ClaimsPrincial Doesn't Set Claims From JWT 【发布时间】:2020-08-31 14:57:00 【问题描述】:

我正在开发一个 SPA,它使用 Azure Function App 作为 API 和 Azure Active Directory 进行身份验证。 adal.access.token在用户登录后设置在本地存储中,但是在绑定的ClaimsPrincipal参数中没有正确设置声明,也没有在HttpRequest参数中设置。无论是否设置了 Authorization: Bearer ... 标头,声明主体对象看起来都相同。如何配置我的 Function App 以使用 AAD 和 ClaimsPrincipalbinding?我使用jwt.io 的令牌调试器验证了声明是在访问令牌中设置的。

public static MyFunction 
  [FunctionName("MyFunction")]
  public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "some-path")],
    ClaimsPrincipal principal
  )
     // principal does not contain the claims, or any of the token info
  

然后我发送请求:

curl -X GET -H "Authorization: Bearer ..." http://localhost:7071/api/some-path

But the claims principle only has one claim, `http://schemas.microsoft.com/2017/07/functions/claims/authlevel: Admin`

更新: 在 Azure 中调用时,主体变量似乎已按预期设置,但在本地开发时未设置。

【问题讨论】:

【参考方案1】:

我假设您使用功能服务应用控制面板通过使用 azure ad 和 express 或其他方式激活身份验证来创建应用注册。这样做会创建应用注册并将应用功能作为回复 url, 因此,如果您在开发环境中本地运行它并尝试登录,它将永远不会将令牌发送到您的本地计算机,因为它不是源 URL。

基本上,您必须在 azure ad 中进行应用注册,进行身份验证并添加一个额外的回复/重定向 url,以指向您的应用的本地主机地址,无论是什么。 http://localhost:youriisexpressport 有点像。那么它也将在本地工作。

【讨论】:

问题不在于登录,而在于后续的 API 调用。在本地开发时,仅使用一些默认值设置声明主体......它只有一个声明authlevel: Admin。当我将相同的代码推送到 Azure 并调用 API 函数时,声明主体包含 JWT 字符串中实际存在的所有内容。 希望这有帮助:***.com/questions/49390877/… 他们似乎在这里有一个解决方法:, 您是否尝试过查看样本,其中类似的样本 - contos.io/…?

以上是关于Azure Function App Binding ClaimsPrincial 不设置来自 JWT 的声明的主要内容,如果未能解决你的问题,请参考以下文章

从 Azure Function App 访问带有防火墙的 Azure Blob 存储

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

Azure Function App 不由事件中心触发

Azure Function App 对 Webhook 的初始响应

如何确定 Webhook 未触发 Azure Function App 的原因

Azure Function App:身份验证中断开发门户