2017-03-01 48 views
0

我们的应用程序将做简单的User.ReadBasic.All函数,根据我的理解,它不需要管理员权限。 使用流记录在这里:https://graph.microsoft.io/en-us/docs/authorization/app_onlyAuthorization_IdentityNotFound错误MS Graph API

  POST https://login.microsoftonline.com/{tenantId}/oauth2/token    HTTP/1.1 
     Content-Type: application/x-www-form-urlencoded 

     grant_type=client_credentials 
     &client_id=<clientId> 
     &client_secret=<clientSecret> 
     &resource=https://graph.microsoft.com 

我能够调用返回以下错误消息的图形时,获得一个有效的访问令牌,但是:

  “code": "Authorization_IdentityNotFound", "The identity of the calling application could not be established." 

我们已经建立了我们的应用程序在管理控制台中拥有User.ReadAll.Basic权限,有趣的是,当我使用我自己的凭证/令牌缓存启动具有appId和Secret的ConfidentialClientApplication实例时,我确实从API获得了成功的结果,并且为令牌调用AcquireTokenSilentAsync:

 string signedInUserID = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value; 
     tokenCache = new SessionTokenCache(
      signedInUserID, 
      HttpContext.Current.GetOwinContext().Environment["System.Web.HttpContextBase"] as HttpContextBase); 

     ConfidentialClientApplication cca = new ConfidentialClientApplication(
      appId, 
      redirectUri, 
      new ClientCredential(appSecret), 
      tokenCache); 

但是我们正在创建一个无状态,无头的服务,它将没有用户交互,因此理想情况下我们不想回复用户凭证和令牌缓存以检索访问令牌。我不确定为什么一个场景有效,另一个是返回IdentityNotFound错误,并且您有任何建议都是值得欢迎的。

+0

你能解决这个问题吗?我有同样的问题 – NBajanca

+0

嗨@NBajanca是这是一个关于我们试图访问的特定范围管理员权限的问题。一旦我们的应用程序被授予访问管理员读取我们租户中的目录数据,我们就可以通过应用程序身份查询(我们决定使用比应用程序秘密更安全的证书)让我知道如果您有任何其他问题 – ranah

+0

谢谢,同时我也发现了这一点。我在Microsoft图形文档中创建了一个问题,看看他们是否可以更好地解释范围 – NBajanca

回答

0

从我了解的不需要管理员权限。

AFAIK,当使用客户端凭证流程时,我们需要为app设置应用程序权限,委托权限用于委托流程。

你可以尝试下面的代码使用ADAL让用户:

 string authority = "https://login.microsoftonline.com/a703965c-e057-4bf6-bf74-1d7d82964996"; 
     AuthenticationContext authenticationContext = new AuthenticationContext(authority, false); 
     var result= await authenticationContext.AcquireTokenAsync("https://graph.microsoft.com", new ClientCredential("clientid", "clientsecret")); 


     string sURL = "https://graph.microsoft.com/v1.0/users"; 

     WebRequest request1 = WebRequest.Create(sURL); 
     request1.Method = "GET"; 
     request1.Headers.Add("Authorization", "Bearer " + result.AccessToken); 
     HttpWebResponse response1 = (HttpWebResponse)request1.GetResponse(); 
     if (response1.StatusCode == HttpStatusCode.OK) 
     { 
      // some code 
     } 

您可以设置 “读取所有用户的全部资料” 申请许可Microsfot图(测试):

​​