Создать OAuth2PermissionGrant для ресурсов через Graph - PullRequest
0 голосов
/ 19 мая 2018

Мой сценарий - создать приложение и приложение через AAD Graph.Это довольно просто (с переадресацией для согласия на основе браузера), что я сейчас хочу сделать, это сразу дать согласие на spn (как вы можете сделать на портале).Сам код прост:

var g = new OAuth2PermissionGrant();
g.ClientId = thePrincipal.ObjectId;
g.ConsentType = "AllPrincipals";
g.PrincipalId = null;
g.ResourceId = ##resourceId##;
g.ExpiryTime = DateTime.Now.AddYears(10);
g.Scope = "User.Read";
await client.Oauth2PermissionGrants.AddOAuth2PermissionGrantAsync(g);

Теперь часть, которую я не понял правильно, это ##resourceId##.Предполагается, что это будет resourceId - в примере кода это должна быть Windows Azure Active Directory.Как получить идентификатор ресурса, например, для следующего необходимого доступа к ресурсу (00000002-0000-0000-c000-000000000000):

RequiredResourceAccess =
    new [] {
        new RequiredResourceAccess() {
                ResourceAppId = "00000002-0000-0000-c000-000000000000",
                    ResourceAccess = new [] {
                        new ResourceAccess() {
                            Id = new Guid("311a71cc-e848-46a1-bdf8-97ff7156d8e6"), // sign in and read profile (delegated perm)
                                Type = "Scope"
                        },

Поиск ResourceAppId -> resourceId (приложение к spn) - это то, что мне не хватает.Например, AAD, Graph, manage.office.com и др.

1 Ответ

0 голосов
/ 21 мая 2018

Из документации для объекта OAuth2PermissionGrant поле resourceId поля OAuth2PermissionGrant является objectId объекта ServicePrincipal объект для ресурса:

Указывает objectId участника службы ресурса, к которому предоставлен доступ.

Итак, изарендатору, в котором вы создаете OAuth2PemrissionGrant , вам нужно получить объект ServicePrincipal , соответствующий приложению-ресурсу, которому вы хотите предоставить разрешение, и из этого объекта прочитайте objectId property.

Если у вас есть ресурсное приложение AppId, вы можете получить соответствующий ServicePrincipal объект (если он существует) с помощью:

GET https://graph.windows.net/{tenant}/servicePrincipals
        ?$filter=appId eq '{app-id-guid}'
        &api-version=1.6

С помощьюMicrosoft.Azure.ActiveDirectory.GraphClient (я думаю, это то, что вы используете в своем коде), вы должны сделать это с помощью:

graphClient.ServicePrincipals.Where(sp => sp.AppId == "{app-id-guid}")

Если то, что вы должны определить, приложение-ресурс не являетсяидентификатор приложения Guid, но (несколько) дружественный идентификатор URI (например, "https://graph.microsoft.com"),, который вы можете получить соответствующий ServicePrincipal объект, отфильтровав по servicePrincipalNames .

С помощью Azure AD Graph:

GET https://graph.windows.net/{tenant}/servicePrincipals
        ?$filter=servicePrincipalNames/any(n:n eq 'https://graph.microsoft.com'))
        &api-version=1.6

С Microsoft.Azure.ActiveDirectory.GraphClient:

graphClient.ServicePrincipals
    .Where(sp => sp.ServicePrincipalNames.Any(n => n == "https://graph.microsoft.com"))
...