Authorization_IdentityNotFound错误MS Graph API

时间:2017-03-01 18:02:33

标签: adal microsoft-graph

我们的应用程序将执行简单的User.ReadBasic.All函数,根据我的理解,不需要管理员权限。 使用此处记录的流程:https://graph.microsoft.io/en-us/docs/authorization/app_only

         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权限,有趣的是,当我使用自己的凭据/令牌缓存启动时,我确实从API获得了成功的结果具有appId和secret的ConfidentialClientApplication实例,并为令牌调用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错误,欢迎你提出任何建议。

1 个答案:

答案 0 :(得分: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
        }

您可以设置&#34;阅读所有用户&#39;完整档案&#34; Microsfot Graph的应用许可(用于测试):

enter image description here