2016-03-24 15 views
4

WebアプリケーションでMicrosoftグラフからデータを取得しようとしています。Microsoft Graph - サイレントトークンの取得に失敗しました

私がAcquireTokenSilentAsync()に電話すると、「トークンを静かに取得できませんでした。コールメソッドAcquireToken」というエラーが表示されます。

したがって、AcquireTokenAsync()メソッドを使用して試しました。これはトークンを取得しますが、リソースにアクセスしようとすると、403 - 禁止されます。

私はFiddlerでテストして動作します。

AcquireTokenAsync()からトークンを調べ、それをフィドラーから得られたトークンと比較すると、それは長さの約1/3です。これが問題なのか、修正があるのか​​分かりません。

誰かがこの問題の解決策を知っていますか?

次のように私のコードは:

入手トークン():

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()(アクセスリソース):

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:

また、キャッシュの内容を調べて、これをパラメータと比較してAcquireTokenSilentAsync()に渡して、すべてが一致するように見えます。

+0

私は本当にこれに対する解決策を見つけるのに苦労していますか?誰にも解決策はありますか? – DaRoGa

答えて

1

私が見つけた唯一の解決策は、新しいAzureアプリケーションを別のものと全く同じ権限で作成し、自分のアプリケーションを新しいクライアントIDとクライアントの秘密に向けることでした。私はなぜこれがうまくいったのか分かりませんが、それではグラ​​フを照会できるようになりました。私はこれが将来誰かに役立つことを願っています。

関連する問題