Asp.net web api Azure AD userAssertion:令牌缺少作用域“Directory.Read.All”

Asp.net web api Azure AD userAssertion:令牌缺少作用域“Directory.Read.All”,asp.net-web-api,azure-active-directory,Asp.net Web Api,Azure Active Directory,我有一个Web API和一个使用ADAL库调用Web API的UI应用程序 在将应用程序注册到Azure AD时,我已经为Web API和UI应用程序授予了读取目录数据的委派权限 我在Web API中有以下代码,用于为登录用户保存令牌 private void ConfigureAuthentication(IAppBuilder app) { app.UseWindowsAzureActiveDirectoryBearerAuthentication(

我有一个Web API和一个使用ADAL库调用Web API的UI应用程序

在将应用程序注册到Azure AD时,我已经为Web API和UI应用程序授予了读取目录数据的委派权限

我在Web API中有以下代码,用于为登录用户保存令牌

private void ConfigureAuthentication(IAppBuilder app)
    {
        app.UseWindowsAzureActiveDirectoryBearerAuthentication(
             new WindowsAzureActiveDirectoryBearerAuthenticationOptions
             {
                 Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
                 TokenValidationParameters = new TokenValidationParameters { SaveSigninToken = true, ValidAudience = ConfigurationManager.AppSettings["ida:Audience"] }
             });
    }
现在在Web API控制器中,我尝试使用以下代码获取令牌以访问Microsoft AD Graph API

var bootstrapContext = ClaimsPrincipal.Current.Identities.First().BootstrapContext as System.IdentityModel.Tokens.BootstrapContext;
            string userName = "test@onmicrosoft.com";
            string userAccessToken = bootstrapContext.Token;
            UserAssertion userAssertion = new UserAssertion(bootstrapContext.Token, "urn:ietf:params:oauth:grant-type:jwt-bearer", userName);

            var authContext = new AuthenticationContext(string.Format(CultureInfo.InvariantCulture, aadInstance, tenant));
            var clientCred = new ClientCredential(clientId, appKey);

            var result = await authContext.AcquireTokenAsync("https://graph.windows.net", clientCred, userAssertion);
            accessToken = result.AccessToken;
上面的代码返回令牌,但范围值如下

`scp: "User.Read"`
问题-为什么令牌不提供目录访问directory.Read.All,因为我已经设置了目录访问权限

`scp: "Directory.Read.All User.Read"`
更新:

我缺少授权权限下读取目录数据的权限。授予授予权限后,我能够获得范围为scp的令牌:Directory.Read.All User.Read


如果我理解正确,您希望使用Microsoft Graph API,而不是Azure AD Graph API

然而,基于您在本问题中发布的屏幕截图是一个v1 enpoint AAD应用程序,它与您试图接近的Microsoft Graph API无关。所以,无论您在这个应用程序上做了什么更改,结果都应该是相同的。我建议您在注册v2 enpoint应用程序

下面是一个演示如何获取用于使用Microsoft Graph的身份验证令牌的示例


希望这有帮助

您想使用AAD Graph API还是Microsoft Graph?您设置的权限是针对Azure AD Graph API,而不是Microsoft Graph。此外,v1端点的作用域可以在清单中定义,您可以更改oauth2Permissions的值。一旦它被定义,它将保留该值。这个案例有任何处理吗?@Wayne,我可以在单击“授予权限”后获得“读取目录数据”权限。请参阅我的问题更新。谢谢你的帮助嘿,谢谢你的回复,你是说这是错误的urn:ietf:params:oauth:grant type:jwt beareri想使用Azure AD Graph API我需要更改的值是oauth2Permissions@Sorry对于我的误解,如果您想使用AAD Graph API,范围是在oauthPermissions的值中定义的,你能建议吗?如何设置