1

Azure Active DirectoryをAngularで使用してマルチテナントアプリケーションを実装しました。ユーザがアプリケーションにログインした後、ユーザ情報を取得できます。 Active Directoryから取得していないため、私は以下のスニペットのようなGraph APIを実装しています。マルチテナントアプリケーションのActive Directoryユーザイメージで401(Unauthorized)エラーを取得する

ここ
public Task<UserDto> getPhoto(TenantDto tenantDto) 
    { 
     var client = new HttpClient(); 
     client.BaseAddress = new Uri(String.Format("https://graph.windows.net/{0}/users/{1}/thumbnailPhoto?api-version=1.6", tenantDto.tenantKey, tenantDto.email)); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("image/jpeg")); 
     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tenantDto.token); 
     HttpResponseMessage response = client.GetAsync("").Result; 
     if (response.IsSuccessStatusCode) 
     { 
      return null; 
      //Status status = response.Content.ReadAsAsync<Status>().Result; 
      //if (status.Code == 200) 
      // InBoundResponse = JsonConvert.DeserializeObject<InBoundCallResponse>(status.Data.ToString()); 
      //return InBoundResponse; 
     } 
     else 
     { 
      return null; 
     } 
    } 

tenantDto.token私は401 (Unauthorized)エラーを取得しています。このグラフAPIを呼び出している間、ユーザーにログインし、「トークン」に他なりません。私はすべてを使ってみた。 は、私は、Active Directory APPでの設定グラフAPIを変更しているにも添付 またenter image description here

以下のように私はそれが単一のテナントのためにのみ

[Route("AdUserImage"), HttpGet] 
    public async Task<HttpResponseMessage> userImage() 
    { 
     var authContext = new AuthenticationContext("https://login.windows.net/sampletest.onmicrosoft.com/oauth2/token"); 
     var credential = new ClientCredential(clientID, clientSecret); 
     ActiveDirectoryClient directoryClient = new ActiveDirectoryClient(serviceRoot, async() => 
     { 
      var result = await authContext.AcquireTokenAsync("https://graph.windows.net/", credential); 
      return result.AccessToken; 
     }); 

     var user = await directoryClient.Users.Where(x => x.UserPrincipalName == "[email protected]").ExecuteSingleAsync(); 
     DataServiceStreamResponse photo = await user.ThumbnailPhoto.DownloadAsync(); 
     using (MemoryStream s = new MemoryStream()) 
     { 
      photo.Stream.CopyTo(s); 
      var encodedImage = Convert.ToBase64String(s.ToArray()); 
     } 
     //string token = await HttpAppAuthenticationAsync(); 
     Status status = new Status("OK"); 
     status = new Status("Found", null, "User exists."); 

     return Request.CreateResponse(HttpStatusCode.OK, status, _jsonMediaTypeFormatter); 
    } 

を働いているコードの下のように試してみましたが、私は、マルチテナントのために実装する必要がありますアプリ。

すべての回答ありがとうございます。

ありがとうございました........!

+0

いくつかの異なる '401'にエラーがあります(https://msdn.microsoft([こちら]を参照してください。/app-graph-api-error-code-and-error-handling)) '401'に関する詳細なエラーメッセージは何ですか? –

+0

{ "odata.error":{ "コード": "Authentication_MissingOrMalformed"、 "メッセージ":{ "ラング": "EN"、 "値": "アクセストークンが存在しないか、不正な形式の" }、 "日付": "2017-10-11T07:02:15"、 "requestId": "4f112369-931d-4a24-8f61-e303b0acb9c1"、 "値":NULL }}エラーメッセージ一方Graph APIを呼び出すが、ユーザーが自分のアプリケーションに直接ログインした後、Graph APIを呼び出しているため、トークンは有効です。ありがとう –

+0

アクセストークン、デリゲートトークン、またはアプリケーショントークンのどのフローを取得していますか? –

答えて

1

委任ユーザトークン:

1 .Acquire implict流を介してトークン:

https://login.microsoftonline.com/{tenant}/oauth2/authorize?response_type=token&client_id={clientId}&redirect_uri={redirect_uri}&resource=https%3A%2F%2Fgraph.windows.net&nonce={nonce} 

2は.callアズールADグラフ

GET: https://graph.windows.net/{tenant}/me/thumbnailPhoto?api-version=1.6 
Content-Type: image/jpeg 

アプリケーショントークン:

1 .Acquireトークンだけ複数のテナントのためのサインインのユーザーのサムネイル写真を取得する場合は、クライアントの資格情報が

POST:https://login.microsoftonline.com/{tenant}/oauth2/token 
grant_type=client_credentials&client_id={client_id}&client_secret={client_secret}&resource=https%3A%2F%2Fgraph.windows.net 

2は.callのAzure ADグラフ

GET:https://graph.windows.net/{tenant}/users/{upn}/thumbnailPhoto?api-version=1.6 
Content-Type: image/jpeg 

フローを経て、最初にAzure ADでログインし、デリゲートユーザーのアクセストークンを取得し、そのトークンを使用してAzure AD Graph RESTを呼び出す必要があります。トークンのこの2種類の違い、あなたは以下のリンクを参照できます。

Get access on behalf of a user

Get access without a user

+0

Delegate-userトークンとアプリケーショントークンのトークンを取得できません –

+0

アプリケーショントークンは、通常、アプリケーションが登録されている単一のテナントに使用されます。アクセストークンを取得したい場合は、他のテナントのためにアプリケーションを使用する必要があります。そのテナントの管理者は、アクセストークンを正常に取得するには、そのアクセス許可( 'Directory.Read.All'必要な管理者権限)を付与する必要があります。その後、サインインユーザーからテナント情報を取得し、リクエストで変更する必要があります。その後もうまくいくはずです。それでも問題がある場合は、取得したトークンを共有してください。 –

+0

@BalarajuPolakiこの問題についてまだ問題はありますか?あなたの踏み台ブロックがあれば教えてください。 –

関連する問題