1

각도로 Azure Active Directory를 사용하여 멀티 테넌트 응용 프로그램을 구현했습니다. 4. 사용자가 내 응용 프로그램에 로그인하면 사용자 정보를 얻을 수 있습니다. Active Directory에서 점점 그 아래에 스 니펫처럼 그래프 API를 구현하지 못했습니다. 내가 401 (Unauthorized) 오류가있어이 그래프 API를 호출하는 동안멀티 테넌트 응용 프로그램의 Active Directory 사용자 이미지에서 401 (권한없는) 오류 받기

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은 로그인 한 사용자의 "토큰"에 불과하다. 나는 아무 쓸데없이 노력했다. Active Directory의 APP에서 내가 변경 한 그래프 API 설정들도 내가 그것을 하나의 세입자

[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); 
    } 

만 작동하고 코드를 아래와 같이 시도 또한 enter image description here

첨부 아래 좋아하지만 난 멀티 테넌트 구현해야 앱.

아무 답변 감사합니다.

미리 감사드립니다 ........!

+0

은 여러 가지'401' 오류 (있습니다 참조 [여기] (https://msdn.microsoft. 404/en-us/library/azure/ad/graph/howto/azure-ad-graph-api-error-codes-and-error-handling))'401'에 대한 자세한 오류 메시지는 무엇입니까? –

+0

{ "odata.error": { "코드": "Authentication_MissingOrMalformed" "메시지": { "LANG" "엉" "값": "액세스 토큰이 없거나 잘못된." }, "날짜": "2017-10-11T07 : 02 : 15", "RequestID가": "4f112369-931d-4a24-8f61-e303b0acb9c1", "값"널 (null) } } 오류 메시지 동안 그래프 API를 호출하지만 사용자가 직접 내 응용 프로그램에 로그인 한 후 그래프 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 애저 AD 그래프

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

경우에만 여러 테넌트에 대한 사용자의 로그인의 썸네일 사진을 얻을 경우, 먼저 Azure AD로 로그인하여 위임자 사용자의 액세스 토큰을 획득하고 해당 토큰을 사용하여 Azure AD Graph REST를 호출해야합니다. 토큰이 이가지의 차이, 당신은 아래의 링크를 참조 할 수 있습니다 :

Get access on behalf of a user

Get access without a user

+0

위임 - 사용자 토큰 및 응용 프로그램 토큰에 대한 토큰을 가져올 수 없습니다. –

+0

응용 프로그램 토큰은 일반적으로 응용 프로그램이 등록 된 단일 임차인에 사용됩니다. 액세스 토큰을 얻으려면 다른 테넌트에 대한 앱을 사용하고, 앱이 액세스 토큰을 성공적으로 가져 오기 전에 해당 거주자의 관리자가 권한 ('Directory.Read.All' 필수 관리자 권한)을 부여해야합니다. 그 후에도 로그인 사용자로부터 세입자 정보를 가져 와서 요청에서 수정할 필요가 있으며 그 후에도 잘 작동해야합니다. 문제가 계속되는 경우 획득 한 토큰을 공유하십시오. –

+0

@BalarajuPolaki이 문제에 대해 여전히 문제가 있습니까? 어떤 조치를 취했는지 알려 주시면 언제든지 알려 주시기 바랍니다. –