2016-03-24 7 views
4

Ich versuche, Daten aus dem Microsoft-Diagramm in meiner Webanwendung zu erhalten.Microsoft Graph - Konnte Token im Hintergrund nicht abrufen

Wenn ich AcquireTokenSilentAsync() rufe, erhalte ich den Fehler "Konnte Token nicht stillschweigend erhalten. Aufrufmethode AcquireToken".

Daher versuchte ich dann mit der AcquireTokenAsync() Methode. Dies erhält ein Token, aber wenn ich versuche, auf die Ressource zuzugreifen, bekomme ich 403 - Verboten.

Ich habe es in Fiddler getestet und es funktioniert.

Wenn ich das Token von AcquireTokenAsync() untersuchen und es mit dem Token von Fiddler vergleichen, ist es etwa 1/3 der Länge. Ich weiß nicht, ob das ein Problem ist und ob es eine Lösung gibt.

Kennt jemand eine Lösung für dieses Problem?

Mein Code ist wie folgt:

GetToken():

public async static Task<AuthenticationResult> GetTokenAsync(AuthenticationContext ctx, string resourceId) 
{ 
    ClientCredential credential = new ClientCredential(OfficeSettings.ClientId, OfficeSettings.ClientSecret); 
    var userObjectId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value; 
    UserIdentifier ident = new UserIdentifier(userObjectId, UserIdentifierType.UniqueId); 

    var redirectUrl = new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)); 

    try 
    { 
     var result = await ctx.AcquireTokenSilentAsync(resourceId, credential, ident); 
     //var result = await ctx.AcquireTokenAsync(resourceId, credential); 
     LastAuthority = ctx.Authority; 
     return result; 
    } 
    catch (AdalException e) 
    { 
     ctx.TokenCache.Clear(); 
     return null; 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
} 

GetUserEmail() (Zugriff auf Ressource):

private const string _allUsersUrl = "https://graph.microsoft.com/beta/users?$filter=displayName%20eq%20'{0}'"; 

public static async Task<List<string>> GetUserEmails(List<string> displayNames) 
{ 
    var emails = new List<string>(); 
    using (var client = new HttpClient()) 
    { 
     foreach (var name in displayNames) 
     { 
      var url = string.Format(_allUsersUrl, name.Replace(" ", "+")).Replace(" ", "%20"); 
      using (var req = new HttpRequestMessage(HttpMethod.Get, url)) 
      { 
       var token = await GetToken(); 
       req.Headers.Add("Authorization", string.Format("Bearer {0}", token)); 
       req.Headers.TryAddWithoutValidation("Content-Type", "application/json"); 
       using (var response = await client.SendAsync(req)) 
       { 
        //TODO: Forbidden error message. However, token seems to be retrieved correctly 
        var content = await response.Content.ReadAsStringAsync(); 
        foreach (var item in JObject.Parse(content)["value"]) 
        { 
         emails.Add(item["userPrincipalName"].ToString()); 
        } 
       } 
      } 
     } 
    } 
    return emails; 
} 

EDIT:

Ich habe auch den Inhalt des Cache überprüft und verglich dies mit den Parametern, die an AcquireTokenSilentAsync() übergeben werden und alles scheint übereinzustimmen.

+0

Ich habe wirklich Mühe, eine Lösung zu finden? Hat jemand irgendwelche Lösungen? – DaRoGa

Antwort

1

Die einzige Lösung, die ich gefunden habe, war, eine neue Azure-Anwendung mit genau den gleichen Berechtigungen wie die andere zu erstellen und meine Anwendung auf die neue Client-ID und das Client-Secret zu verweisen. Ich weiß nicht, warum das funktioniert hat, aber es hat funktioniert und ich kann jetzt die Grafik abfragen. Ich hoffe, das hilft jemandem in Zukunft.