列出所有加入的团队

时间:2017-08-24 18:48:29

标签: azure-active-directory microsoft-graph

我有一个网站,我有用户登录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;
}

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

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的代码,根据Marc的回答,可能导致我无法访问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;
    }
}

1 个答案:

答案 0 :(得分:0)

如果您正在使用应用程序权限(又名“客户端凭据流”),则无法使用/me/调用任何方法。 /me/路径要求在上下文中有用户。这仅在用户进行身份验证并且您正在使用委派权限(即“授权授予”或“隐式授权”流)时才会发生。

joinedTeams方法尤其还有一个known issue,目前将其限制为me用户,从而无法实现应用场景。

我建议使用Delegated范围转向授权授权流程,并要求用户进行身份验证。这将启用me用户上下文,并允许您检索joinedTeams

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