我的方案是创建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等。
答案 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"))