2017-08-24 40 views
1

我有一个网站,我有用户登录Azure AD,然后我试图获得用户所属的所有Microsoft团队的列表。我正在使用GraphServiceClient,它似乎没有测试版的东西,但我想我已经解决了这个问题,看下面的例子,如果有更好的方法让我知道。列出所有加入团队

首先,当我创建GraphServiceClient时,我将beta端点提供给像这样的构造函数。

public GraphServiceClient GetAuthenticatedClient(string userId) { 
_graphClient = new GraphServiceClient("https://graph.microsoft.com/beta", new DelegateAuthenticationProvider(
    async(requestMessage) => { 
    // Passing tenant ID to the sample auth provider to use as a cache key 
    AccessToken = await _authProvider.GetUserAccessTokenAsync(userId); 

    // Append the access token to the request 
    requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken); 
    })); 

return _graphClient; 
} 

您还会注意到,我存储的accessToken因为我需要后来,这就是为什么我的问题,如果有更好的方式来处理这个问题。

然后在我试图获得加入团队名单的方法中,我正在执行以下操作。

public static async Task < IEnumerable <string>> GetGroups(GraphServiceClient graphClient) { 
var request = graphClient.Me.Request().GetHttpRequestMessage(); 
request.RequestUri = new Uri(request.RequestUri.AbsoluteUri + "/joinedTeams"); 

//request.RequestUri = new Uri("https://graph.microsoft.com/beta/groups"); 
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", GraphSDKHelper.AccessToken); 

request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

try { 
    var response = await graphClient.HttpProvider.SendAsync(request); 
    var stream = await response.Content.ReadAsStreamAsync(); 
} catch (Exception e) {} 

//var gs = await graphClient.Me.MemberOf.Request().GetHttpRequestMessage();//.GetAsync(); 
var results = new List <string>(); 
var groups = await graphClient.Groups.Request().GetAsync(); 
do { 
    foreach(var group in groups) { 
    results.Add(group.DisplayName); 
    } 
    groups = await groups.NextPageRequest.GetAsync(); 
} while (groups.NextPageRequest != null); 

return results; 
} 

您可以看到有2个零件。我尝试使用加入的团队调用的第一部分,但是这给我以下错误。然后我列出所有的组,并且一个工作正常。

Message: Authorization has been denied for this request. 

Inner error 

在portal.azure.com我有应用注册设置,并给予user.read.all应用程序的权限

enter image description here

也user.read.all下委托权限(不确定我需要给它)。

enter image description here

那么,为什么这不工作,如果有,我不是正确地做其他的事情,请让我知道。

经过一些更多的测试后,还有一个附注。问题真的是我。每当我和我打电话,即我/驱动器等错误。我可以打电话给用户[XXXXX] /驱动器,这工作正常,但我下面的任何失败。

编辑

他是创建GraphServiceClient,这基于以下马克的答案可能是我不能够访问me问题的原因代码:

public GraphServiceClient GetAuthenticatedClient(string userId) 
{ 
    _graphClient = new GraphServiceClient("https://graph.microsoft.com/beta", new DelegateAuthenticationProvider(
     async(requestMessage) => 
     { 
      // Passing tenant ID to the sample auth provider to use as a cache key 
      AccessToken = await _authProvider.GetUserAccessTokenAsync(userId); 

      // Append the access token to the request 
      requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken); 
     })); 

    return _graphClient; 
} 

public async Task<string> GetUserAccessTokenAsync(string userId) 
{ 
    TokenCache userTokenCache = new SessionTokenCache(userId, _memoryCache).GetCacheInstance(); 

    try 
    { 
     AuthenticationContext authContext = new AuthenticationContext(_aadInstance, userTokenCache); 
     ClientCredential credential = new ClientCredential(_appId, _appSecret); 
     AuthenticationResult result = await authContext.AcquireTokenAsync(_graphResourceId, credential); 

     return result.AccessToken; 
    } 
    catch (Exception ex) 
    { 
     return null; 
    } 
} 

回答

0

如果”重新使用应用程序权限(又名“客户端凭证流程”),不可能使用/me/调用任何方法。 /me/路径要求上下文中有用户。这只发生在用户通过身份验证并且您使用委托权限(又称“授权授予”或“隐式授权”流程)时。

joinedTeams特别是也有一个known issue目前限制它为me用户,有效地使应用程序方案不可能。

我建议使用Delegated scopes来转移到授权授权流程并要求用户进行认证。这将启用me用户上下文并允许您检索joinedTeams

至于存储令牌,这不是一个好的解决方案。令牌相对较短。相反,您应该请求“Offline Access”权限。这将启用refresh_token,您可以根据需要存储和使用它来检索新的access_token

+0

用户通过Azure AD登录到应用程序。那么,我需要做些什么才能使委托权限摆脱位置。我已经为应用程序注册进行了检查。 –

+1

我编辑了我的问题以显示我在创建GraphServiceClient时使用的所有代码。 –