Не удалось получить сведения о команде из консольного приложения c #, пока оно работает из обозревателя графиков - PullRequest
0 голосов
/ 29 октября 2018

Мне нужно собрать данные Microsoft Teams из консольного приложения C # с помощью Microsoft Graph.

Я использую ADAL и клонировал методы аутентификации из образца https://github.com/microsoftgraph/console-csharp-connect-sample. Единственное отличие состоит в том, что я использую HttpClient клиента, а не GraphServiceClient, который не реализует объекты Teams. Список необходимых разрешений был определен с помощью трассировки Fiddler запроса, сделанного с помощью Graph Explorer (нет необходимости в 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

Все отлично работает с моим консольным приложением, если я не запрашиваю ресурсы команд:

  1. Я могу получить список групп "Команды" со следующими запрос: 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-Unautorized: https://graph.microsoft.com/beta/groups/{groupId}/team
    Очень расстраивает, что этот последний шаг хорошо работает с Graph Explorer

Моя проблема очень похожа на Доступ запрещен при запросе команд в Microsoft Graph , но в моем случае я являюсь членом команды, к которой я пытаюсь получить доступ, и запрос работает с 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);
    }       
}

1 Ответ

0 голосов
/ 29 октября 2018

Вам не хватает области. Вам нужно иметь Group.Read.All, чтобы прочитать группу или команду .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...