通过Graph为Resources创建OAuth2PermissionGrant

时间:2018-05-19 08:49:19

标签: azure-active-directory azure-ad-graph-api

我的方案是创建app&通过AAD Graph spn。这很容易(通过重定向基于浏览器的同意),我现在想要做的是立即同意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。如何获取resourceId,例如以下所需的资源访问权限(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(app to spn)是我所缺少的。例如,AAD,Graph,manage.office.com等。

1 个答案:

答案 0 :(得分:1)

来自documentation for the OAuth2PermissionGrant entity OAuth2PermissionGrant resourceId 字段是 ServicePrincipal objectId >资源的对象:

  

指定已授予访问权限的资源服务主体的 objectId

因此,从您正在创建 OAuth2PemrissionGrant 的租户中,您需要检索与您要授予的权限的资源应用相对应的 ServicePrincipal 对象,从该对象中,读取 objectId 属性。

如果您拥有资源应用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应用程序ID,而是(某种程度上)友好标识符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"))