2017-07-14 6 views
1

Ich beginne mit meiner Frage. Wie lese ich Daten aus meinem AAD mithilfe von Microsoft Graph mithilfe einer App-Registrierung in einem Azure AD? Nun werden die Details ...Zugriff auf Microsoft Graph mit AAD App

Ich habe eine App Registrierung in meinem Azure Active Directory und erlaubt den Zugriff auf Microsoft Graph dort erstellt:

AAD portal with required permissions

Um genau zu sein die App hat folgende Berechtigungen:

  • Applikationsrechte
    • aller Benutzer relevante Personen Listen lesen und den Regisseur suchen y
    • Lesen Sie alle Benutzer ein Profil
  • delegierte Berechtigungen (None)

ich den folgenden Code in meinem ASP.NET MVC-app verwenden, um meine Website gegen die AAD zu authentifizieren:

public void SignIn() 
{ 
    if (!Request.IsAuthenticated) 
    { 
     HttpContext.GetOwinContext().Authentication.Challenge(
      new AuthenticationProperties 
      { 
       RedirectUri = "/" 
      }, 
      OpenIdConnectAuthenticationDefaults.AuthenticationType); 
    } 
} 

das ist so ziemlich die Standardeinstellung für organisatorische Auth. Dies funktioniert, und ich kann auch meine Benutzer Informationen aus dem AAD Profil auslesen:

private string GetUserName() 
{       
    var claimsPrincipal = ClaimsPrincipal.Current;   
    var firstName = claimsPrincipal.FindFirst(ClaimTypes.GivenName).Value; 
    var lastName = claimsPrincipal.FindFirst(ClaimTypes.Surname).Value; 
    return $"{firstName} {lastName}"; 
} 

Jetzt versuche ich, läßt das Avatar-Bild sagt Microsoft Graph zu optain zu verwenden. Es sind einige offizielle MS-Proben verfügbar here. Aber alle von ihnen verlassen sich auf ein NuGet-Paket namens Microsoft.Identity.Client, das derzeit eine Vorschau ist. Die andere Sache ist, dass MS möchte, dass ich meine App unter Application Registration Portal registriere, was für mich keinen Sinn ergibt, weil ich bereits eine registrierte App habe.

ich versucht schon meine Inhaber Token aus meiner Ansprüche Identität abzurufen und in Graph wie folgt zu verwenden:

var ci = (System.Security.Claims.ClaimsIdentity)ClaimsPrincipal.Current.Identity; 
var token = ((System.IdentityModel.Tokens.BootstrapContext)ci.BootstrapContext).Token; 
var endpoint = "https://graph.microsoft.com/v1.0/me/photo/$value"; 
using (var client = new HttpClient()) 
{ 
    using (var request = new HttpRequestMessage(HttpMethod.Get, endpoint)) 
    {      
     request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); 
     var response = await client.SendAsync(request);     
     if (response.IsSuccessStatusCode) 
     { 
      return await response.Content.ReadAsStreamAsync(); 
     }      
    } 
} 
return null; 

Aber das gibt meinem 401.

Antwort

0

Sie benötigen einen Token bekommen mit ADAL mit Die Client-ID und das Geheimnis Ihrer App.

Sie können von NuGet ADAL erhalten: https://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/

ZB:

string authority = "https://login.microsoftonline.com/your-tenant-id"; 
var authenticationContext = new AuthenticationContext(authority); 

string clientId = "your-app-client-id"; 
string clientSecret = "yourappclientsecret"; 
var clientCredential = new ClientCredential(clientId, clientSecret); 

string resource = "https://graph.microsoft.com"; 
AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(resource, clientCredential); 

string accessToken = authenticationResult.AccessToken; 

ersetzen your-Mieter-ID mit Ihrem Azure AD Mieter-ID oder Domainnamen (zB mytenant.onmicrosoft.com) . Ersetzen Sie Ihre-App-Client-ID durch die Client-ID/Anwendungs-ID der App, die in AAD registriert ist. Ersetzen Sie yourappclientsecret mit dem Client-Geheimnis/Schlüssel für die App in AAD erstellt.

Ich habe sie in dem Beispiel hart-codiert, um es einfacher zu folgen. In der Produktion sollten Sie keine Zugangsdaten im Code speichern.

Verwandte Themen