当通过浏览器表单验证时,从Azure API应用程序获取用户信息

本文关键字:API Azure 应用程序 获取 信息 用户 浏览器 表单 验证 | 更新日期: 2023-09-27 17:51:11

当使用Postman在Chrome和x-zumo-auth标头中进行身份验证时,我的API应用程序在控制器中使用以下代码成功识别用户的upn:

Runtime runtime = Runtime.FromAppSettings(Request);
EmaUserInfo user = runtime.CurrentUser;
TokenResult token = await user.GetRawTokenAsync("aad");
string upn = token.Claims[ClaimTypes.Upn];

然而,当使用微软的AzureCards控制台客户端示例代码(将浏览器添加到窗体窗口并捕获zumo令牌)时,我无法获得用户的aad令牌,并从API应用程序获得以下错误:

Request to https://[gateway].azurewebsites.net/api/tokens?tokenName=aad&api-version=2015-01-14 GET failed BadRequest 400 (Bad Request)
{
  "status": 400,
  "source": "https://[gateway].azurewebsites.net/api/tokens?tokenName=aad&api-version=2015-01-14",
  "message": "Microservice '[API App]' only has permissions for token ''. Can't get token 'aad'"
}
有趣的是,当我设置一个断点并将zumo令牌从测试程序复制到postman中时,甚至会发生这种情况。程序失败,邮递员成功返回。据我所知,他们发送的请求完全一样。我还能错过什么呢?

编辑:我做了一些更多的测试,发现邮差方法在隐身模式下也会产生同样的错误。这让我相信,这不仅仅是x-zumo-auth头需要设置,但也有一些cookie需要设置,以便用户正常工作。如果我生成令牌,从apiapp url中删除cookie并仅使用令牌POST请求,我也可以得到错误。

当通过浏览器表单验证时,从Azure API应用程序获取用户信息

API应用程序应该有一个:authentication"数组,它看起来像这样:

"authentication": [{"type": "aad"}]

你最终的apiapp。Json应该是这样的:

{
"$schema": "http://json-schema.org/schemas/2014-11-01/apiapp.json#",
"id": "YourApiApps",
"namespace": "microsoft.com",
"gateway": "2015-01-14",
"version": "1.0.0",
"title": "YourApiApps",
"summary": "",
"author": "",
"endpoints": {
    "apiDefinition": "/swagger/docs/v1",
    "status": null
},
"authentication": [{"type": "aad"}]}

那么,请重新部署并再次检查。这应该能解决这个问题。