2017-08-24 16 views
1

私はAzure ADでユーザーのログインがあるWebサイトを持っており、そのユーザーが参加しているすべてのMicrosoftチームの一覧を取得しようとしています。私はGraphServiceClientを使用していますが、ベータ版が入っていないようですが、私は下の例を参照して作業していると思います。参加しているすべてのチームを一覧表示

まず、GraphServiceClientを作成するときに、このようにコンストラクタにベータエンドポイントを指定しています。

public GraphServiceClient GetAuthenticatedClient(string userId) { 
_graphClient = new GraphServiceClient("https://graph.microsoft.com/beta", new DelegateAuthenticationProvider(
    async(requestMessage) => { 
    // Passing tenant ID to the sample auth provider to use as a cache key 
    AccessToken = await _authProvider.GetUserAccessTokenAsync(userId); 

    // Append the access token to the request 
    requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken); 
    })); 

return _graphClient; 
} 

はまた、私はこれを処理するためのより良い方法があれば質問理由である、後のことを必要とするので、私はAccessTokenを格納していていることがわかります。

次に、私が参加チームのリストを取得しようとしている方法で、私は次のことをしています。

public static async Task < IEnumerable <string>> GetGroups(GraphServiceClient graphClient) { 
var request = graphClient.Me.Request().GetHttpRequestMessage(); 
request.RequestUri = new Uri(request.RequestUri.AbsoluteUri + "/joinedTeams"); 

//request.RequestUri = new Uri("https://graph.microsoft.com/beta/groups"); 
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", GraphSDKHelper.AccessToken); 

request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

try { 
    var response = await graphClient.HttpProvider.SendAsync(request); 
    var stream = await response.Content.ReadAsStreamAsync(); 
} catch (Exception e) {} 

//var gs = await graphClient.Me.MemberOf.Request().GetHttpRequestMessage();//.GetAsync(); 
var results = new List <string>(); 
var groups = await graphClient.Groups.Request().GetAsync(); 
do { 
    foreach(var group in groups) { 
    results.Add(group.DisplayName); 
    } 
    groups = await groups.NextPageRequest.GetAsync(); 
} while (groups.NextPageRequest != null); 

return results; 
} 

これには2つの部分があることがわかります。最初の部分は私が参加チームコールを使用しようとしているが、それは私に次のエラーを与える。それから、私はすべてのグループを列挙しています。そのグループはうまくいきます。

portal.azure.comで
Message: Authorization has been denied for this request. 

Inner error 

私は、App登録を設定しているとuser.read.allアプリケーションの権限user.read.all委任権限の下でも

enter image description here

と(いないを与えています私はそれを与える必要があります)。

enter image description here

、なぜこれが仕事と私が正しくやっていないよ、他のものがあるなら、私に知らせてくださいません。

もう少しテストした後に追加の注釈が1つ追加されます。問題は本当に私です。いつでも、私のもの、つまり私/ドライブなどと何かを呼び出すときはいつもそれはエラーです。私はユーザー[XXXXX] /ドライブに電話することができ、それは正常に動作しますが、私の下のものはすべて失敗します。

編集

彼は下記のマークの回答に基づいてGraphServiceClientを作成するコードは、meにアクセスすることができないの私の問題の原因である可能性があります:

public GraphServiceClient GetAuthenticatedClient(string userId) 
{ 
    _graphClient = new GraphServiceClient("https://graph.microsoft.com/beta", new DelegateAuthenticationProvider(
     async(requestMessage) => 
     { 
      // Passing tenant ID to the sample auth provider to use as a cache key 
      AccessToken = await _authProvider.GetUserAccessTokenAsync(userId); 

      // Append the access token to the request 
      requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken); 
     })); 

    return _graphClient; 
} 

public async Task<string> GetUserAccessTokenAsync(string userId) 
{ 
    TokenCache userTokenCache = new SessionTokenCache(userId, _memoryCache).GetCacheInstance(); 

    try 
    { 
     AuthenticationContext authContext = new AuthenticationContext(_aadInstance, userTokenCache); 
     ClientCredential credential = new ClientCredential(_appId, _appSecret); 
     AuthenticationResult result = await authContext.AcquireTokenAsync(_graphResourceId, credential); 

     return result.AccessToken; 
    } 
    catch (Exception ex) 
    { 
     return null; 
    } 
} 

答えて

0

あなたが」アプリケーション権限(別名「クライアント資格情報フロー」)を使用している場合は、/me/を使用して任意のメソッドを呼び出すことはできません。 /me/パスには、コンテキスト内にユーザーが存在する必要があります。これは、ユーザーが認証され、委任されたアクセス許可(別名「認可許可」または「暗黙的な許可」フロー)を使用している場合にのみ発生します。

joinedTeamsのメソッドは、known issueを現在持っていますが、現在のところユーザーをmeに限定しており、アプリケーションシナリオを効果的に不可能にしています。

私は委任されたスコープで認可グラントフローにピボットし、ユーザーに認証を求めることをお勧めします。これによりmeユーザーコンテキストが有効になり、joinedTeamsを取得できるようになります。

トークンの格納に関しては、これは良い解決策ではありません。トークンは比較的短命です。代わりに、 "オフラインアクセス"アクセス許可を要求する必要があります。これにより、必要に応じて新しいaccess_tokenを取得するために保存して使用できるrefresh_tokenが有効になります。

+0

ユーザーはAzure ADを使用してアプリケーションにログインしています。だから、委任された権限をピボットするために何をする必要がありますか。私はすでに両方のアプリケーション登録をチェックしました。 –

+1

GraphServiceClientの作成に使用するコードをすべて表示するように私の質問を編集しました。 –

関連する問題