0

我在订阅客户星座中的 callRecords 时遇到问题,我得到响应状态 Forbidden(见帖子末尾)。

我做了这个步骤:

  1. 使用 CallRecords.Read.All 注册一个应用程序注册并获得管理员同意
  2. 在尝试发送 POST 请求时,它在我的任何编码程序中都不起作用,但在 Postman 中它与应用程序许可一起工作。

它适用于 Postman,但不适用于 Azure Functions(在本地启动)或其他编码应用程序,需要获取合适的不记名令牌。如果使用我从程序例程获得的令牌发送 Post-request,我会收到 Forbidden as Response 消息。

                HttpClient client = new HttpClient();
                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, new Uri("https://login.microsoftonline.com/" + TenantId + "/oauth2/v2.0/token"));

                List<KeyValuePair<string, string>> parameters = new List<KeyValuePair<string, string>>();
                parameters.Add(new KeyValuePair<string, string>("client_id", ClientId));
                parameters.Add(new KeyValuePair<string, string>("scope", "https://graph.microsoft.com/.default"));
                parameters.Add(new KeyValuePair<string, string>("client_secret", ClientSecret));
                parameters.Add(new KeyValuePair<string, string>("grant_type", "client_credentials"));
                request.Content = new FormUrlEncodedContent(parameters);

                HttpResponseMessage response = await client.SendAsync(request);
                string data = await response.Content.ReadAsStringAsync();
                Token = JsonConvert.DeserializeObject<TokenResponse>(data);

清单 1:获取访问令牌

我分析了我用 jwt.ms 获得的这个令牌(ID 和其他信息用 *** 标记)

  "typ": "JWT",
  "nonce": "***",
  "alg": "RS256",
  "x5t": "l3sQ-50cCH4xBVZLHTGwnSR7680",
  "kid": "l3sQ-50cCH4xBVZLHTGwnSR7680"
}.{
  "aud": "https://graph.microsoft.com",
  "iss": "https://sts.windows.net/***/",
  "iat": 1633425547,
  "nbf": 1633425547,
  "exp": 1633429447,
  "aio": "***",
  "app_displayname": "***",
  "appid": "***",
  "appidacr": "1",
  "idp": "https://sts.windows.net/***/",
  "idtyp": "app",
  "oid": "***",
  "rh": "***",
  "sub": "***",
  "tenant_region_scope": "EU",
  "tid": "***",
  "uti": "***",
  "ver": "1.0",
  "wids": [
    "0997a1d0-0d1d-4acb-b408-d5ca73121e90"
  ],
  "xms_tcdt": 1373376639
}.[Signature]

令牌的 JSON 信息

来自代码的令牌和我从邮递员应用程序获得的令牌之间的区别是SCP:“CallRecords.Read.All”

然后我发现如果我使用带有委托权限的应用程序注册 User.read.All 如果我有一个有效的用户登录到相关的租户中,那么所有的工作都对我有用,因此创建呼叫记录订阅成功。但是在客户端,我们只有一个应用程序注册+密钥,具有 callrecords.read.all 和 User.read.all 权限。在客户案例中,我每次都在未经许可的情况下获得令牌。并且在租户中无法重定向到邮递员回调 URL。

我阅读了文档https://docs.microsoft.com/de-de/graph/sdks/choose-authentication-providers?tabs=CS#client-credentials-provider和相应的链接,但我没有得到我必须做的概述做。

我尝试了 youtube 视频https://www.youtube.com/watch?v=Z1xFjmttEvY用于发送此帖子的逻辑应用程序 - 步骤类似于创建客户应用程序注册。但它也失败了(同样的错误)。我在正文中使用了https://graph.microsoft.com/v1.0/subscriptions

{
    "resource": "/communications/callRecords",
    "changeType": "created",
    "clientState": "clientStateValue",
    "notificationUrl": " working URLendpoint>",
    "expirationDateTime": "2021-09-28T18:58:05.9125505Z",
    "latestSupportedTlsVersion": "v1_2"
}
{
  "error": {
    "code": "ExtensionError",
    "message": "Operation: Create; Exception: [Status Code: Forbidden; Reason: The request is not authorized for this user or application.]",
    "innerError": {
      "date": "2021-10-05T21:47:03",
      "request-id": "aa624900-02bb-4b06-92ba-755889b1f459",
      "client-request-id": "aa624900-02bb-4b06-92ba-755889b1f459"
    }
  }
}
BadRequest. Http request failed as there is an error getting AD OAuth token: 'AADSTS7000112: Application '***'(***-***-***-***-***) is disabled. Trace ID: ***-***-**-***-**Correlation ID: ***-***-***-***-***Timestamp: 2021-10-05 22:58:29Z'.

更新这件事发生了,允许用户登录 但它不会伤害 Postman,它可以工作。为什么会这样,为什么我可以复制这种行为?

请有人告诉我我做错了什么或我必须做什么,以便我可以像邮递员一样获取令牌作为应用程序的请求?

4

2 回答 2

0

您尝试添加所需管理员同意的权限。如果未像下面的屏幕截图中那样同意/授予,AAD 将忽略生成的访问令牌而没有角色声明。

在此处输入图像描述

要获得包含声明的访问令牌,请确保已正确配置两件事。

  1. 确保已为应用程序添加权限并由管理员为应用程序授予/授予 Azure AAD 门户 在此处输入图像描述
  2. 如果应用程序和用户位于不同的租户中,则确保应用程序在用户的租户中具有服务主体,并且已添加并同意了权限。
于 2021-10-06T11:03:54.300 回答
0

发布的问题只是通过无人看管地撤销授予管理员同意而产生的。

所以我会原谅这个帖子,因为通常没有理由。如果无法查看/检查应用程序注册,我无法看到撤销同意。

对于受访者的这种不必要的工作,我深表歉意。

所以一般来说答案是正确的。

于 2021-11-09T22:42:27.413 回答