我正在尝试为OAuth创建Azure AD应用程序,并尝试为其分配权限。该应用程序正在成功创建,但我没有看到正确分配的权限。
以下是我创建应用程序的步骤。
-
使用设备代码流获取访问令牌。(https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-device-code)
-
使用以下C#代码创建应用程序
public async Task CallPostWebApiAndProcessResultAsync(string webApiUrl, string accessToken, string body, Action<JObject> processResult) { if (!string.IsNullOrEmpty(accessToken)) { var defaultRequetHeaders = HttpClient.DefaultRequestHeaders; if (defaultRequetHeaders.Accept == null || !defaultRequetHeaders.Accept.Any(m => m.MediaType == "application/json")) { HttpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); } defaultRequetHeaders.Authorization = new AuthenticationHeaderValue("bearer", accessToken); HttpContent postContent = new StringContent(body, Encoding.UTF8, "application/json"); HttpResponseMessage response = await HttpClient.PostAsync(webApiUrl, postContent); if (response.IsSuccessStatusCode) { string json = await response.Content.ReadAsStringAsync(); JObject result = JsonConvert.DeserializeObject(json) as JObject; processResult(result); } else { // Error } } }
上述功能的参数如下:
- CCD_ 1是:";https://graph.microsoft.com/v1.0/applications">
body
为:"{ "displayName": "App with permissions in tenant", "requiredResourceAccess": [ { "resourceAppId": "00000003-0000-0000-c000-000000000000", "resourceAccess": [ { "id": "75359482-378d-4052-8f01-80520e7db3cd", "type": "Role" }, { "id": "62a82d76-70ea-41e2-9197-370581804d09", "type": "Role" } ]}]}"
我可以验证应用程序是否已成功创建,但无法看到成功分配给它的权限。
我正在尝试分配Graph API权限Files\ReadWrite.All和Group.ReadWrite.All[/em>。这些权限也正在添加,但它们的状态为";无法确定状态";。不会自动授予管理员同意。
在获取设备代码时,我使用租户管理凭据登录,所以我不确定这里还需要什么。
不幸的是,在网上找不到太多关于这个的信息。如果有人知道这件事,请告诉我。
在此处输入图像描述
设置requiredResourceAccess仅用于声明您的应用程序请求的权限(或需要,具体取决于流(。这与实际授予这些权限是不一样的。来自应用程序对象的requiredResourceAccess属性的文档:
requiredResourceAccess集合
指定此应用程序需要访问的资源,以及在每个资源下需要的OAuth权限范围和应用程序角色集。这种对所需资源访问的预配置推动了同意体验。不可为null。
授予应用程序请求的权限的一种方法是使用交互式租户范围的同意URL来获得授予权限的提示,如向应用程序授予租户范围的管理员同意中所述。
或者,您可以使用Microsoft Graph授予这些权限。
应用程序权限是应用程序角色。若要授予应用程序权限,必须在API的服务主体的appRoleAssignedTo集合中创建应用程序角色分配
- 确保存在客户端应用程序的服务主体。如果没有(例如,因为您刚刚创建了应用程序(,则创建服务主体。设
{principal-id}
为客户端应用程序的servicePrincipal对象的id - 检索资源应用程序的服务主体(例如,在本例中为API(。让
{resource-id}
是资源应用程序的servicePrincipal对象的id - 查找您希望授予的应用程序角色的id。在这种情况下,您已经有了它(您在应用程序对象的requiredResourceAccess中使用了它(,但您也可以在资源应用程序的servicePrincipal对象的
appRoles集合中查找它。让{app-role-id}
是要授予的appRole的id - 创建应用程序角色分配:
POST https://graph.microsoft.com/v1.0/servicePrincipals/{resource-id}/appRoleAssignedTo { "principalId": "{principal-id}", "resourceId": "{resource-id}", "appRoleId": "{app-role-id}" }
- 对该API的每个应用程序角色(应用程序权限(重复步骤4
我建议使用Microsoft Graph SDK,而不是手动构建所有这些请求。
警告
通过授予应用程序对Microsoft Graph的权限,您可能会授予应用程序访问您的组织和组织数据的特权。在做这件事之前,一定要充分理解其中的含义。
我认为授予管理员同意是一个需要执行的单独步骤:https://learn.microsoft.com/en-us/azure/active-directory/manage-apps/grant-admin-consent#construct-授予租户范围管理员同意的url