AzureAD多租户应用程序 - “Authorization_RequestDenied”:“没有足够的权限来完成操作

时间:2016-11-17 04:43:41

标签: c# asp.net-mvc adal azure-ad-graph-api

我指的是Multitenant-saas-app样本。我正在尝试获取访问令牌以访问Graph API,然后以静默方式获取访问令牌并再次访问图API。

获取多租户应用的/ common端点的授权码,

private string resourceID = "https://graph.windows.net";

 string authorizationRequest = String.Format(
                "https://login.microsoftonline.com/common/oauth2/authorize?response_type=code&client_id={0}&resource={1}&redirect_uri={2}&state={3}",
                 Uri.EscapeDataString(ConfigurationManager.AppSettings["ida:ClientID"]),
                 Uri.EscapeDataString("https://graph.windows.net"),
                 Uri.EscapeDataString(this.Request.Url.GetLeftPart(UriPartial.Authority).ToString() + "/Onboarding/ProcessCode"),
                 Uri.EscapeDataString(stateMarker)
                 );
return new RedirectResult(authorizationRequest);

使用授权码重定向,(/ Onboarding / ProcessCode)

  ClientCredential credential = new ClientCredential(ConfigurationManager.AppSettings["ida:ClientID"],
                                                                   ConfigurationManager.AppSettings["ida:Password"]);
                AuthenticationContext authContext = new AuthenticationContext("https://login.windows.net/common/");

                //Get token to access grapgh API
                AuthenticationResult result = await authContext.AcquireTokenByAuthorizationCodeAsync(
                   code, new Uri(Request.Url.GetLeftPart(UriPartial.Path)), credential, resourceID);

                AuthenticationHelper.token = result.AccessToken;

这很好用,我获得了访问令牌,我可以访问租户的AzureAD资源。

 ActiveDirectoryClient client = AuthenticationHelper.GetActiveDirectoryClient();
                IPagedCollection<IUser> pagedCollection = await client.Users.ExecuteAsync();

现在我尝试从令牌缓存中获取用于脱机访问的令牌。这次我为租户创建AuthenticationContext。 (我也试过/普通) 这让我有了一个新的访问权限。

 string resourceID = "https://graph.windows.net";
            //Test
            ClientCredential credential = new ClientCredential(ConfigurationManager.AppSettings["ida:ClientID"],
                                                                       ConfigurationManager.AppSettings["ida:Password"]);

            AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/mytenant.net");

            var auth = await authContext.AcquireTokenAsync(resourceID, credential);

            var newToken = auth.AccessToken;
            //Set the token for this session
            AuthenticationHelper.token = auth.AccessToken;

然后我尝试按以前的方式访问API,

ActiveDirectoryClient client = AuthenticationHelper.GetActiveDirectoryClient();
                IPagedCollection<IUser> pagedCollection = await client.Users.ExecuteAsync();

我得到以下异常,

  

错误=“Authorization_RequestDenied”:“权限不足   完成操作。“

我在这里做错了吗?

这是我的应用权限,

enter image description here

1 个答案:

答案 0 :(得分:0)

要使用Azure AD图形REST列出用户,如果您不是全球用户,我们需要读取所有用户的基本配置文件读取所有用户的完整配置文件管理员在租户。

如果您是租户中的全局管理以登录用户身份访问目录也应该能够列出用户的其余API。

有关Azure AD图表范围的更多详细信息,您可以参考here

对于缓存问题,由于您没有提供自定义缓存,因此它将使用基于平台的默认缓存。例如,如果您正在开发.Net应用程序,则缓存正在使用内存来存储对象。所以只有在重新启动应用程序之前它才有效。