0

Azure ADにネイティブアプリを登録し、グラフAPIにアクセスするすべての代理人権限を与えました。次のコードを使用してこのソリューションをコンソールソリューション(exe)でテストしようとしています。クライアントIDと秘密MicrosoftグラフAPIにアクセスするAzure ADALライブラリ

private static async void AcquireTokenAsync() { 
      AuthenticationContext context = new AuthenticationContext("https://login.windows.net/xxxxxx-xxxx-485b-a40f-xxxxxxxx/oauth2/token", true); 
      var result = await context.AcquireTokenAsync("https://graph.microsoft.com", 
                 new ClientCredential("xxxxxx-32cf-xxxx-8888-555555555555", 
                 "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxV89cWfH0w=" 
                ) 
                ); 

      HttpClient client = new HttpClient(); 
      client.DefaultRequestHeaders.Add("Authorization", "Bearer " + result.AccessToken); 
      HttpResponseMessage response = await client.GetAsync("https://graph.microsoft.com/v1.0/users/"); 
      string retResp = await response.Content.ReadAsStringAsync(); 
      string token = result.AccessToken; 
      Console.WriteLine(token + "\n" + restResp); 

} 

token.Iがaccesstokenを取得しますが、トークン

{ 
    "error": { 
    "code": "Authorization_RequestDenied", 
    "message": "Insufficient privileges to complete the operation.", 
    "innerError": { 
     "request-id": "cb7aaaa9-d9a0-485a-7777-b5bfe68ba771", 
     "date": "2017-07-22T11:01:49" 
    } 
    } 
} 

でグラフAPI呼び出しに次のエラー/レスポンスでいます取得に問題はありません間違っている何が起こっているかを示唆してください

答えて

1

デリゲートとアプリのみのアクセス許可の違いを見てくださいhere

実行中の問題は、Graph APIに委任されたアクセス許可を要求したが、異なる種類のアクセス許可を必要とするApp Only Tokenを取得していることです。 take a look at your tokenの場合、トークンにグラフの呼び出しに必要なクレームがないことがわかります。

代わりに、次のいずれかを実行する必要があります。

  1. は認証コードグラントのフロー次のApp +ユーザートークンを取得します。これにより、グラフへのアクセスが委任され、コールが機能するはずです。
  2. グラフAPIに対してアプリケーションのみのアクセス許可をリクエストします。これにより、現在の認証メソッドがGraph APIにアクセスできるようになります。ただし、すべてのApp Only権限では、管理者はアプリケーションに同意する必要があります。
+0

ありがとうございました!私はAppで試して、Web API app registration.Point 1との権限を委譲し、リソース(REST呼び出し)にアクセスすることができます。 –

+0

ポイント2については、管理者用ポータルの権限付与オプションを同意することを言及していますか?Web APIの権限付与を試みると、デリゲート権限またはアプリ権限か両方のコード(同じコード)を使用してリソースにアクセスできます。代理権限のみが存在する場合、私はリソース(不十分な特権)を呼び出すことができません。ネイティブアプリによるリソースは、承認コード許可フローを使用してのみアクセス可能です。また、Web API(許可後)のすべてのリソースパーミッションを削除しても、私は呼び出しを行い結果を得ることができます。 –

+0

はい、ネイティブクライアントは定義上、クライアントシークレットを保持できないため、アプリケーションのみの呼び出しを行うことはできません。この状況では、委任されたフローを常に使用する必要があります。 –

関連する問題