1

Ich habe Multi-Tenant-Anwendung mit Azure Active Directory in Angular 4.After Benutzer in meine Anwendung eingeloggt, ich bin in der Lage, Benutzerinfo.But Benutzerfoto ist nicht aus dem Active-Verzeichnis für das ich habe Graph-API wie unten Snippet implementiert.Fehler 401 (Unauthorized) in Active Directory-Benutzerimage in Multi-Tenant-Anwendung

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

Hier tenantDto.token ist nichts anderes als ein angemeldeter Benutzer „Token“ Während dieses Graph API aufrufen ich bin 401 (Unauthorized) Fehler. Ich habe alles versucht aber keine Verwendung. Ich habe Graph geändert API Einstellung in Active Directory s APP auch wie unten Befestigung enter image description here

Auch ich unten Code versucht haben, wie es nur für einzelne Mieter

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

aber ich brauche zu implementieren für Multi Tenant funktioniert App

Jede Antwort geschätzt.

Vielen Dank im Voraus ........!

+0

Es gibt verschiedene '401' Fehler (siehe [hier] (https://msdn.microsoft. com/de-us/library/azure/ad/graph/howto/azur-ad-graph-api-fehlercodes-und-fehler-handlung)) Was ist die detaillierte Fehlermeldung über '401'? –

+0

{ "odata.error": { "Code": "Authentication_MissingOrMalformed", "message": { "lang": "en", "Wert": "Zugriffstoken fehlt oder fehlerhaft." }, "Datum": "2017-10-11T07: 02: 15", "requestId": "4f112369-931d-4a24-8f61-e303b0acb9c1", "Werte": null } } Fehlermeldung beim Aufrufen der Graph-API, aber Token ist gültig, da nachdem der Benutzer sich direkt in meiner Anwendung angemeldet hat, ich die Graph-API aufgerufen habe.Danke –

+0

Welchen Fluss haben Sie für das Zugriffstoken, den Delegiertoken oder das Anwendungstoken erworben? –

Antwort

1

Delegieren-Benutzer-Token:

1 .Acquire das Token über die implict flow:

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 der Azure AD Graph

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

Token-Anwendung:

1 .Acquire das Token über die Client-Anmeldeinformationen fließen

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 die Azure AD Graph

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

Wenn Sie nur die auf ein Foto von Anmelde-Benutzer für die mehrere Mieter zu bekommen, Sie sollten sich zuerst bei Azure AD anmelden und das Zugriffstoken für den Delegatbenutzer anfordern und dieses Token verwenden, um Azure AD Graph REST aufzurufen. Der Unterschied zwischen diesen beiden Arten von Token, können Sie auf die Links unten verweisen:

Get access on behalf of a user

Get access without a user

+0

Ich bin nicht in der Lage Token für Delegate-User Token und auch für Application Token –

+0

zu erhalten Das Anwendungstoken wird normalerweise für den einzelnen Mandanten verwendet, auf dem sich die Apps registrieren. Wenn Sie das Zugriffstoken erwerben möchten, verwenden Sie die App für den anderen Mandanten. Der Administrator dieses Mandanten muss die Berechtigung erteilen ("Directory.Read.All" erforderliche Administratorberechtigung), bevor die Anwendung das Zugriffstoken erfolgreich abrufen kann. Danach müssen Sie auch die Mandanteninformationen von Ihrem Anmeldebenutzer erhalten und in der Anfrage ändern, danach sollte es auch gut funktionieren. Bitte teilen Sie das Token, wie Sie erworben haben, wenn Sie das Problem noch haben. –

+0

@BalarajuPolaki Haben Sie immer noch das Problem mit diesem Problem? Bitte zögern Sie nicht mich zu informieren, wenn Sie einen Schritt blockieren. –

Verwandte Themen