Добавление приглашенного (гостевого) пользователя в команды не работает должным образом - PullRequest
0 голосов
/ 14 января 2019

Привет (ref выпуск )

После настройки арендатора для разрешения приглашения пользователя из другого домена мы можем приглашать внешних пользователей (в заданном домене) в команды. Это прекрасно работает, когда вы делаете это вручную, в графическом интерфейсе. Однако при попытке добавить приглашенного пользователя выкинуло Windows Graph API, что-то не работает должным образом.

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

  1. Приглашение пользователя к арендатору (с приветствием или без него) https://docs.microsoft.com/en-us/graph/api/invitation-post?view=graph-rest-1.0

  2. Добавить приглашенного пользователя в команду https://docs.microsoft.com/en-us/graph/api/group-post-members?view=graph-rest-1.0

Оба эти вызова успешно завершены и не возвращают никаких сообщений об ошибках. Во всех GUI администратора (AAD, Команды, Exchange) пользователь приглашен и добавлен в группу. Но пользователь, о котором идет речь, не получает приветственное письмо о том, что он / она был добавлен в команду. И если пользователь (если мы отправляем приветственное письмо на шаге 1) пытается получить доступ к http://teams.microsoft.com, пользователь получает уведомление о том, что у него нет разрешений и / или он не видит команду.

Любые советы?

Разрешения API

EDIT: После некоторого расследования, путем мониторинга сетевого трафика. Кажется, что пропущенный вызов, чтобы правильно пригласить в команду, это: ПОСТ https://api.teams.skype.com/emea/beta/teams/($teamurl)/bulkUpdateRoledMembers?allowBotsInChannel=true

, куда вы отправляете список идентификаторов пользователей (8: orgid: {идентификатор пользователя}) и groupid. (Teamurl кажется идентификатором канала)

{ "пользователи": [{ "MRI": "8: orgid: 00000000-5946-0000-87d2-b16b6fdf7a72", "Роль": 2}], "идентификатор_группы": "00000000-2e8b-4d18-0000 -394c6a4846d0" }

Я пытался вызвать это из приложения и делегирования, но получил «Несанкционированный». Также я не смог найти никаких разрешений API, которые предоставили доступ к «api.teams.skype.com».

1 Ответ

0 голосов
/ 11 марта 2019

Я наконец понял, как получить токен доступа для вызова bulkUpdateRoledMembers. Он работает только в том случае, если я запрашиваю токен доступа для него напрямую, поэтому нет прав доступа к приложению и нет доступа к потоку.

private static async Task<string> GetAccessTokenForTeams(string tenantId)
{

    var client = new PublicClientApplication(
        clientId: "d3590ed6-52b3-4102-aeff-aad2292ab01c",
        authority: $"https://login.microsoftonline.com/{tenantId}/",
        userTokenCache: null);

    try
    {
        var result = await client.AcquireTokenInteractive(new[] { "https://api.spaces.skype.com/user_impersonation" }, null).ExecuteAsync();
        return result.AccessToken;
    }
    catch (Exception e)
    {
        Debug.WriteLine(e);
        throw;
    }
}

Оказывается, вам также нужен Skypetoken, который вы можете легко получить с помощью только что приобретенного токена доступа.

private static async Task<string> GetSkypeToken(string accessToken)
{
    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Add(HttpRequestHeader.Authorization.ToString(), "Bearer " + accessToken);

        using (var response = await client.PostAsync("https://api.teams.skype.com/beta/auth/skypetoken", null))
        {
            var contentString = await response.Content.ReadAsStringAsync();
            if (response.IsSuccessStatusCode)
            {
                var skypeTokenResponse = JsonConvert.DeserializeObject<SkypeTokenResponse>(contentString);
                return skypeTokenResponse.Tokens.SkypeToken;
            }
            else
            {
                throw new Exception(response.StatusCode.ToString() + ": " + contentString);
            }
        }
    }
}
private class SkypeTokenResponse
{
    public Token Tokens { get; set; }

    public class Token
    {
        public string SkypeToken { get; set; }
        public string ExpiresIn { get; set; }
    }
}

Тогда вы наконец можете вызвать bulkUpdateRoledMembers, передав оба жетона.

private static async Task<object> bulkUpdateRoledMembers(string accessToken, string skypeToken, string teamUrl, string groupId, string userId)
{
    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Add(HttpRequestHeader.Authorization.ToString(), "Bearer " + accessToken);
        client.DefaultRequestHeaders.Add("X-Skypetoken", skypeToken);

        var bodyString = JsonConvert.SerializeObject(new
        {
            users = new List<object>
            {
                new
                {
                    mri = "8:orgid:" + userId,
                    role = 2
                }
            },
            groupId = groupId
        });
        var body = new StringContent(bodyString, Encoding.UTF8, "application/json");

        using (var response = await client.PutAsync($"https://teams.microsoft.com/api/mt/emea/beta/teams/{teamUrl}/bulkUpdateRoledMembers?allowBotsInChannel=true", body))
        {
            var contentString = await response.Content.ReadAsStringAsync();
            if (response.IsSuccessStatusCode)
            {
                var jsonresult = JObject.Parse(contentString);
                return jsonresult;
            }
            else
            {
                throw new Exception(response.StatusCode.ToString() + ": " + contentString);
            }
        }
    }
}
...