图 Api 身份验证在使用身份验证作为应用程序创建呼叫记录订阅时失败
Graph Api Authentication failed on Creating Subscription for CallRecords with authentification as application
我在订阅 customer constellation 中的 callRecords 时遇到问题,我收到的响应状态为 Forbidden(请参阅 post 末尾)。
我做了这个步骤:
- 使用 CallRecords.Read.All 注册应用程序并获得管理员同意
- 尝试发送 POST-request 它在我的编码程序的 none 中有效,但在 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-Info
代码中的令牌与我从 postman-app 中获得的令牌之间的区别是 SCP:“CallRecords.Read.All”
然后我发现,如果我使用具有委托权限的应用程序注册,如果我有一个有效用户登录了相关租户,User.read.All 对我有用,因此创建 callrecord-subscription 成功。
但是在客户方面,我们只有一个应用程序注册+秘密,并获得 callrecords.read.all 和 User.read.all 的许可。在客户案例中,我每次都在未经许可的情况下获得令牌。并且重定向到 postman callback-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 逻辑应用也发送这个 post - 步骤类似于客户应用注册创建。但它也失败了(同样的错误)。
我用了 https://graph.microsoft.com/v1.0/subscriptions
body:
{
"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,它可以工作。为什么会这样,为什么我可以复制这种行为?
有人可以告诉我我做错了什么或者我必须做什么,这样我才能获得一个令牌,因为 post人是按照应用程序的要求来做的吗?
您尝试添加的权限需要管理员同意。当不同意时 to/granted 如下面的屏幕截图所示,AAD 将忽略生成的没有角色声明的访问令牌。
要获取包含声明的访问令牌,请确保正确配置两件事。
- 确保为应用程序添加了权限,并由 Azure AAD 门户的应用程序管理员同意/授予
- 如果应用程序和用户在不同的租户中,则确保应用程序在用户的租户中有一个服务主体,并添加并同意了权限。
发布的问题只是在无人值守的情况下撤销授予管理员同意而产生的。
所以我会原谅这个帖子,因为通常没有理由。
没有 seeing/checking App Registration 的能力,我看不到 Revoke of Consent。
对于受访者的这种不必要的工作,我深表歉意。
所以大体上答案是正确的。
我在订阅 customer constellation 中的 callRecords 时遇到问题,我收到的响应状态为 Forbidden(请参阅 post 末尾)。
我做了这个步骤:
- 使用 CallRecords.Read.All 注册应用程序并获得管理员同意
- 尝试发送 POST-request 它在我的编码程序的 none 中有效,但在 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-Info
代码中的令牌与我从 postman-app 中获得的令牌之间的区别是 SCP:“CallRecords.Read.All”
然后我发现,如果我使用具有委托权限的应用程序注册,如果我有一个有效用户登录了相关租户,User.read.All 对我有用,因此创建 callrecord-subscription 成功。 但是在客户方面,我们只有一个应用程序注册+秘密,并获得 callrecords.read.all 和 User.read.all 的许可。在客户案例中,我每次都在未经许可的情况下获得令牌。并且重定向到 postman callback-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 逻辑应用也发送这个 post - 步骤类似于客户应用注册创建。但它也失败了(同样的错误)。 我用了 https://graph.microsoft.com/v1.0/subscriptions body:
{
"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'.
通过
有人可以告诉我我做错了什么或者我必须做什么,这样我才能获得一个令牌,因为 post人是按照应用程序的要求来做的吗?
您尝试添加的权限需要管理员同意。当不同意时 to/granted 如下面的屏幕截图所示,AAD 将忽略生成的没有角色声明的访问令牌。
要获取包含声明的访问令牌,请确保正确配置两件事。
- 确保为应用程序添加了权限,并由 Azure AAD 门户的应用程序管理员同意/授予
- 如果应用程序和用户在不同的租户中,则确保应用程序在用户的租户中有一个服务主体,并添加并同意了权限。
发布的问题只是在无人值守的情况下撤销授予管理员同意而产生的。
所以我会原谅这个帖子,因为通常没有理由。 没有 seeing/checking App Registration 的能力,我看不到 Revoke of Consent。
对于受访者的这种不必要的工作,我深表歉意。
所以大体上答案是正确的。