在 Graph Explorer 中工作时无法从 c# 控制台应用程序获取团队详细信息

Failing to get Team details from a c# console app while it works from Graph Explorer

我需要使用 Microsoft Graph 从 C# 控制台应用程序收集 Microsoft Teams 数据。

我正在使用 ADAL 并从 https://github.com/microsoftgraph/console-csharp-connect-sample 示例中克隆身份验证方法。 唯一的区别是我使用的是 HttpClient 客户端,而不是未实现 Teams 对象的 GraphServiceClient。 所需权限的列表已通过使用 Graph Explorer 发出的请求的 Fiddler 跟踪确定(不需要 User.Read.All 或 User.Write.All):
User.Read, Mail.Send, Files.ReadWrite, User.ReadWrite, User.ReadBasic.All, Sites.ReadWrite.All, Contacts.ReadWrite, People.Read, Notes.ReadWrite.All, Tasks.ReadWrite, Mail.ReadWrite, Files.ReadWrite.All, Calendars.ReadWrite

只要我不请求任何 Teams 资源,我的控制台应用程序一切正常:

  1. 我可以通过以下方式获取群组列表 "that are Teams" 要求:https://graph.microsoft.com/beta/groups?$filter=resourceProvisioningOptions/any(v:v eq 'Team')&$select=id,displayname,groupTypes,resourceBehaviorOptions,resourceProvisioningOptions
  2. 我可以通过以下方式成功获取群组详细信息:https://graph.microsoft.com/beta/groups/{groupId}
  3. 但是当我尝试获取该组(我是其中的成员)的团队视图时,它因 HTTP 而失败 403-未授权: https://graph.microsoft.com/beta/groups/{groupId}/team
    非常 令人沮丧的是,最后一步从 图浏览器

我的问题与 非常相似,但就我而言,我是我尝试访问的团队的成员,并且该请求适用于 Graph Explorer。

代码详情:

class AuthenticationHelper
{
    // The Client ID is used by the application to uniquely identify itself to the v2.0 authentication endpoint.
    static string clientId = Constants.ClientId;

    // The list of required permissions have been determined with a Fiddler trace of a request made with Graph Explorer
    // e.g. below are the permissions Grap Explorer requires to run the sample requests
    public static string[] Scopes = {
              "User.Read"
            , "Mail.Send"
            , "Files.ReadWrite"
            , "User.ReadWrite"
            , "User.ReadBasic.All"
            , "Sites.ReadWrite.All"
            , "Contacts.ReadWrite"
            , "People.Read"
            , "Notes.ReadWrite.All"
            , "Tasks.ReadWrite"
            , "Mail.ReadWrite"
            , "Files.ReadWrite.All"
            , "Calendars.ReadWrite" 
    };

    public static PublicClientApplication IdentityClientApp = new PublicClientApplication(clientId);
    public static string UserToken = null;
    public static DateTimeOffset Expiration;

    //-----------------------------------------------------------------------------------------------------------------
    public static async Task<HttpClient> GetAuthenticatedHttpClient()
    {
        HttpClient client = null;
        try
        {
            client= new HttpClient(new HttpClientHandler { UseCookies = true });

            var token = await GetTokenForUserAsync();

            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
            // This header has been added to identify our sample in the Microsoft Graph service.  If extracting this code for your project please remove.
            client.DefaultRequestHeaders.Add("SampleID", "TestCSharp-AzureToken");

            return client;
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Could not create a graph client: " + ex.Message);
        }

        return client;
    }

    //-----------------------------------------------------------------------------------------------------------------
    public static async Task<string> GetTokenForUserAsync()
    {
        AuthenticationResult authResult;
        try
        {
            IEnumerable<IAccount> accounts = await IdentityClientApp.GetAccountsAsync();
            IAccount firstAccount = accounts.FirstOrDefault();

            authResult = await IdentityClientApp.AcquireTokenSilentAsync(Scopes, firstAccount);
            UserToken = authResult.AccessToken;
        }

        catch (Exception)
        {
            if (UserToken == null || Expiration <= DateTimeOffset.UtcNow.AddMinutes(5))
            {
                authResult = await IdentityClientApp.AcquireTokenAsync(Scopes );
                UserToken = authResult.AccessToken;
                Expiration = authResult.ExpiresOn;
            }
        }

        return UserToken;
    }
}

//----------------------------------------------------
// Console entry point

class Program
{
    //public static GraphServiceClient client;
    public static HttpClient _client;

    static async Task<string> GetHttpResponse(string url)
    {
        string responseBody = null;
        _client = await AuthenticationHelper.GetAuthenticatedHttpClient();

        HttpResponseMessage response = await _client.GetAsync(url);
        response.EnsureSuccessStatusCode();

        using (HttpContent content = response.Content)
        {
            responseBody = await response.Content.ReadAsStringAsync();
            logger.Trace(responseBody);
        }

        return responseBody;
    }

    static void Main(string[] args)
    {
        // call 1 is working: list groups that "are Microsoft Teams"
        string s;
        string url = "https://graph.microsoft.com/beta/groups?$filter=resourceProvisioningOptions/any(v:v eq 'Team')&$select=id,displayname,groupTypes,resourceBehaviorOptions,resourceProvisioningOptions";
        s = await GetHttpResponse(url);
        Console.WriteLine(s);

        // call 2 is working: Display details of one of these groups 
        Console.Write($"Enter the id of the group/teams to search for: ");
        string groupId = Console.ReadLine().Trim().ToLower();
        url = $"https://graph.microsoft.com/beta/groups/{groupId}";
        s = await GetHttpResponse(url);
        Console.WriteLine(s);

        // call 3 is failing: Display the team view of this groups 
        url = url + "/team";
        s = await GetHttpResponse(url);
        Console.WriteLine(s);
    }       
}

您缺少瞄准镜。您需要 Group.Read.All 才能 read a Group or Team.