2017-04-24 4 views
1

グラフAPIを使用して、Azure ADによって管理されるユーザーアカウントのプロパティを設定しようとしています。ユーザーがサインアップポリシーを完了した後、バックエンドのWeb APIがAzure ADによって呼び出され、ユーザーが自分で設定できないプロパティ(たとえば、新しいユーザーの内部顧客ID)を設定するという考えがあります。グラフAPIは、許可が与えられてもAuthorization_RequestDeniedを返します。

残念ながら、グラフAPIは、ユーザーを更新するパッチ要求を送信しようとすると、常に例外(「この操作に匹敵する権限がありません」)を返します。 アカウントが更新されたときにログインしているユーザーがいないため、すべてのユーザーの権限を管理者として付与しようとしています。私は基本的に私のアプリケーションを自動的にユーザープロファイルを管理できる第三者にしたい。

私のコードは次のようになります。私は登録されたアプリケーションのアプリケーションID、ディレクトリのテナントと私はクライアントシークレットとしてAzureの中で生成した鍵を使用してい

public class GraphAPIClient 
{ 
    private AuthenticationContext authContext; 
    private ClientCredential clientCredential; 
    private string adTenant; 

    public GraphAPIClient(string tenant, string clientID, string clientSecret) 
    { 
     authContext = new AuthenticationContext("https://login.microsoftonline.com/" + tenant); 
     clientCredential = new ClientCredential(clientID, clientSecret); 
     adTenant = tenant; 
    } 

    public async Task<string> UpdateUserInfo(string objectID, string jsonUpdate) 
    { 
     return await SendPatchRequest("https://stackoverflow.com/users/" + objectID, jsonUpdate); 
    } 

    private async Task<string> SendPatchRequest(string api, string jsonRequest) 
    { 
     AuthenticationResult authResult = await authContext.AcquireTokenAsync("https://graph.windows.net/", clientCredential); 
     HttpClient httpClient = new HttpClient(); 
     string url = "https://graph.windows.net/" + adTenant + api + "?" + "api-version=1.6"; 

     HttpRequestMessage request = new HttpRequestMessage(new HttpMethod("PATCH"), url); 
     request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken); 
     request.Content = new StringContent(jsonRequest, Encoding.UTF8, "application/json"); 

     HttpResponseMessage response = await httpClient.SendAsync(request); 
     if(!response.IsSuccessStatusCode) 
     { 
      string error = await response.Content.ReadAsStringAsync(); 
      object formattedError = JsonConvert.DeserializeObject(error); 
       throw new Exception("Graph API request failed:\n" + JsonConvert.SerializeObject(formattedError, Formatting.Indented)); 
     } 

     return await response.Content.ReadAsStringAsync(); 
    } 
} 

。私は正常にトークンを受け取る。

  • を私が設定している(または私は私が持っていると思います)のユーザーを編集するために必要な権限:私が試した何

    。私は管理者アカウントを使用して「許可の許可」をクリックし、Azureパネルで表示するとアクセス許可が表示されます。 Image

  • 「すべてのユーザーのフルプロファイルを読み書きする」と「読み書きデータ"。これらのタスクのための適切なアクセス許可ですか?
  • 新しいアプリケーション登録コンソールを使用しようとしましたが、トークンを取得しようとすると「呼び出し元アプリケーションのIDを確立できませんでした」という例外が表示されます。このコンソールで作成されたアプリケーションは、通常のAzure ADパネルでは表示されません。

誰でも私にこれを手伝ってもらえますか?私は徹底的に調査しましたが、この問題に関するほとんどの質問は古く、古いAzureパネルの使用をお勧めします。私はそれを試みましたが、それはまだ動作しません、私は新しいAzureパネルが最近AD編集機能を受け取り、それらの質問がされたときにそれらを持っていなかったと思います。

ご連絡ありがとうございます。これ以上の情報が必要な場合は、ご提供いただき誠にありがとうございます。

+0

管理者同意のワークフローも完了しましたか? –

+0

私は持っているとは思わない - 管理者の同意をアプリケーション全体に一度か、アプリケーション内で自動的に与える方法はあるのか?私は基本的に、ユーザーが自分で設定できない情報をユーザーアカウントに追加するバックグラウンドアプリケーションを開発しようとしています。ユーザーに同意を求めるワークフローがあることは承知していますが、それは既存のユーザーアカウント(Officeなど)にアクセスしようとするサードパーティのアプリケーションではなく、私たちが探しているものではないようです – Philippe

答えて

0

シナリオとコードには、クライアント資格情報フローとアプリケーション権限の使用が反映されています。ただし、Azureポータルのスクリーンショットでは、委任された権限のみが設定されています。

したい権限/操作の種類に応じて、次の2つのアプローチを活用することができます

  1. 権限の限られたセットをセットアップする最も簡単な:Azureのポータルを介して。「アプリケーションのアクセス許可」からアクセス許可を選択してから、許可をに変更してください。あなたがネイティブアプリケーションとしてあなたのアプリを作ったからそれが表示されなければ。サーバー側でしっかりと座ってヘッドレスクライアント(エンドユーザーに渡さない)あなたはアプリケーションの権限へのアクセスを提供するWebアプリ/ APIを選ぶ必要がある場合:設定すること

    Application permissions in Azure Portal

  2. ハーデストが、権限の最も広いセット:PowerShellを介して。これは、ユーザーを削除できるようにする場合に実行可能な唯一のオプションです。

    $appDisplayName = <Your-app-display-name> 
    
    $msolcred = Get-Credential 
    Connect-MsolService -credential $msolcred 
    
    $servicePrincipal = Get-MsolServicePrincipal | where DisplayName -eq $appDisplayName 
    $objectId = $servicePrincipal.ObjectId.ToString() 
    
    Add-MsolRoleMember -RoleObjectId 88d8e3e3-8f55-4a1e-953a-9b9898b8876b -RoleMemberObjectId $objectId -RoleMemberType servicePrincipal 
    Add-MsolRoleMember -RoleObjectId 9360feb5-f418-4baa-8175-e2a00bac4301 -RoleMemberObjectId $objectId -RoleMemberType servicePrincipal 
    Add-MsolRoleMember -RoleObjectId fe930be7-5e62-47db-91af-98c3a49a38b1 -RoleMemberObjectId $objectId -RoleMemberType servicePrincipal 
    

    を代わりにあなたがthis article.の手順に従うことができ、次のようにあなたのアプリケーションのServicePrincipalIDを取得し、サービスプリンシパルに必要なロールを付与する必要があります。

+0

"あなたがネイティブアプリケーションとしてあなたのアプリを作ったのでそれが表示されないなら、それは表示されません。" **ありがとうございました!**私はいつもアプリケーションのアクセス許可が表示されない理由を知りましたが、私はそれを思いつきませんでした。 それでも動作しません。私は次のアクセス許可を設定し、それらを与えましたが、私はまだ例外が発生します:http://imgur.com/a/O8ktB 私はかつてBad Requestエラーを受け取りましたが、JSON文字列がいずれにしても無効です。 – Philippe

+0

Nevermind - 新しい鍵を生成しましたが、現在は動作しています。本当にありがとう、本当に助けてくれました。 – Philippe

関連する問題