API Graph - New-ApplicationAccessPolicy в Exchange 365 для регистрации приложений не работает - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь реализовать ограничение с помощью New-ApplicationAccessPolicy, чтобы запретить отправку электронных писем из любой учетной записи пользователя при использовании данной регистрации приложения. Но электронные письма и другие действия, связанные с чтением сообщений, все еще работают. Например, я не хочу, чтобы приложение могло отправлять или читать электронную почту для пользователя mateoj@iadbsec.onmicrosoft.com.

Если я проверяю разрешения в консоли PowerShell Exchange, это показывает, что доступ для этой комбинации пользовательского приложения отказано:

Test-ApplicationAccessPolicy -Identity mateoj@iadbsec.onmicrosoft.com -AppId f5990b66-5e57-4d29-b990-79580009fb7a</p> <p>RunspaceId : 6800e63c-6ed3-40ca-a7b0-8aa114a3488a AppId : f5990b66-5e57-4d29-b990-79580009fb7a Mailbox : mateoj MailboxId : 0b5221ff-c190-47c5-8c1c-50435b5abfee MailboxSid : S-1-5-21-3773200467-1648347138-3333334462-20495337 AccessCheckResult : Denied

Но я все еще могу читать или отправлять электронные письма для этой учетной записи.

Пользователь уже согласен с разрешениями для предыдущей версии этого приложения в AD, но политика Exchange должна отклонять запросы.

imageUser->Applicactions->Permissions">

Это исходный код:


        string[] scopes = new string[] { "user.read" };
        private async void CallGraphButton_Click(object sender, RoutedEventArgs e)
        {
            AuthenticationResult authResult = null;
            var app = App.PublicClientApp;
            ResultText.Text = string.Empty;
            TokenInfoText.Text = string.Empty;

            var accounts = await app.GetAccountsAsync();
            var firstAccount = accounts.FirstOrDefault();

            try
            {
                authResult = await app.AcquireTokenSilent(scopes, firstAccount)
                    .ExecuteAsync();
            }
            catch (MsalUiRequiredException ex)
            {
                System.Diagnostics.Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");

                try
                {
                    authResult = await app.AcquireTokenInteractive(scopes)
                        .WithAccount(accounts.FirstOrDefault())
                        .WithParentActivityOrWindow(new WindowInteropHelper(this).Handle) // optional, used to center the browser on the window
                        .WithPrompt(Prompt.SelectAccount)
                        .ExecuteAsync();
                }
                catch (MsalException msalex)
                {
                    ResultText.Text = $"Error Acquiring Token:{System.Environment.NewLine}{msalex}";
                }
            }
            catch (Exception ex)
            {
                ResultText.Text = $"Error Acquiring Token Silently:{System.Environment.NewLine}{ex}";
                return;
            }

            if (authResult != null)
            {
                ResultText.Text = await GetHttpContentWithToken(graphAPIEndpoint, authResult.AccessToken);
                DisplayBasicTokenInfo(authResult);
                this.SignOutButton.Visibility = Visibility.Visible;
            }
        }

        public async Task<string> GetHttpContentWithToken(string url, string token)
        {
            var httpClient = new System.Net.Http.HttpClient();
            System.Net.Http.HttpResponseMessage response;
            try
            {
                var request = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get, url);
                //Add the token in Authorization header
                request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
                response = await httpClient.SendAsync(request);
                var content = await response.Content.ReadAsStringAsync();
                return content;
            }
            catch (Exception ex)
            {
                return ex.ToString();
            }
        }

Токен, который получает приложение, содержит не только запрошенные области "пользователя .read "но все области, на которые пользователь уже согласился:

  "typ": "JWT",
  "nonce": "0ehQiH41_yQ12B5YRoxiXQPSTNvNbcL8tgL5Rn2axhY",
  "alg": "RS256",
  "x5t": "YMELHT0gvb0mxoSDoYfomjqfjYU",
  "kid": "YMELHT0gvb0mxoSDoYfomjqfjYU"
}.{
  "aud": "00000003-0000-0000-c000-000000000000",
  "iss": "https://sts.windows.net/35463e7c-329a-4bda-8176-329ba27c9300/",
  "iat": 1587492891,
  "nbf": 1587492891,
  "exp": 1587496791,
  "acct": 0,
  "acr": "1",
  "aio": "42dgYJgXuZKBP7Q/mOHxzc1NZ1VObFt+Jzhlg1hPSl1iBn+wRAEA",
  "amr": [
    "pwd"
  ],
  "app_displayname": "ASP.NET Graph Tutorial",
  "appid": "f5990b66-5e57-4d29-b990-79580009fb7a",
  "appidacr": "0",
  "family_name": "J",
  "given_name": "Mateo",
  "ipaddr": "100.15.106.170",
  "name": "Mateo J",
  "oid": "0b5221ff-c190-47c5-8c1c-50435b5abfee",
  "platf": "3",
  "puid": "10032000AF94C708",
  "scp": "Calendars.Read email Mail.Read Mail.Send openid profile User.Read",
  "sub": "7RUo9SosiVWj38mVDqx_TLjx9cke-9kXqlq-UzPydHk",
  "tid": "35463e7c-329a-4bda-8176-329ba27c9300",
  "unique_name": "mateoj@iadbsec.onmicrosoft.com",
  "upn": "mateoj@iadbsec.onmicrosoft.com",
  "uti": "BarWkwo_skyYDqHDUKYnAA",
  "ver": "1.0",
  "xms_st": {
    "sub": "m0q26l-BwZKjl1W3FHV0jn1iRfCEAiIdE4BNu3gQ_F8"
  },
  "xms_tcdt": 1586707572
}.[Signature]

Это разрешения, которые имеет AppRegistration: enter image description here

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

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Вы можете просто удалить приложение (субъект службы) из списка «Корпоративные приложения» на портале azure напрямую, поскольку операция согласия пользователя фактически создает приложение предприятия (субъект службы). Поэтому после того, как мы удалим его из списка «Корпоративные приложения», в следующий раз, когда мы запросим согласие пользователя (только с областью действия user.read), оно заново создаст корпоративное приложение только с разрешением «user.read». Маркер доступа не будет содержать разрешения, такие как mail.read ...

0 голосов
/ 22 апреля 2020

ApplicationAccessPolicies поддерживают только разрешения приложений и учетные данные клиента OAuth-поток. Права делегирования не поддерживаются.

Если вы хотите убедиться, что ваше приложение для делегирования прав не используется определенными пользователями, мы рекомендуем выполнить шаги, перечисленные в https://docs.microsoft.com/en-us/azure/active-directory/manage-apps/disable-user-sign-in-portal

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