Как войти в Azure Active Directory как пользователь в Test-Code? - PullRequest
0 голосов
/ 12 февраля 2019

Я новичок в Azure и немного борюсь за изучение всех функций Azure Active Directory (AAD), поэтому я надеюсь, что вы сможете кое-что прояснить для меня.Вот что я уже сделал:

  • Я зарегистрировал веб-приложение, которое служит поставщиком ресурсов и предлагает различные API-интерфейсы для службы управления API.

  • Веб-приложение имеет несколько пользователей и ролей в AAD.Кроме того, более подробные разрешения установлены на уровне приложения. Таким образом, AAD не контролирует все разрешения моих пользователей.

  • Проверка подлинности пользователей осуществляется с использованием OAuth 2.0 .На практике это означает, что если новый пользователь пытается войти в мое приложение, он перенаправляется на страницу входа в Microsoft, вводит имя пользователя и пароль, а затем получает токен JWT с сервера аутентификации Microsoft.

Теперь, что я хочу сделать:

Я хочу написать приложение, работающее на моем сервере сборки, которое проверяет права пользователей.Приложение должно быть написано на C # .NET Core.Сейчас я борюсь за то, как войти в систему как пользователь из моего кода, поэтому мой вопрос:

Как я могу войти как пользователь из кода в AAD и получить токен JWT для проверки разрешений пользователей?Могу ли я сделать это, просто используя имя пользователя / пароль, или мне нужно зарегистрировать мое тестовое приложение в AAD?Каковы наилучшие решения для достижения моих целей?

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

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Я действительно нашел способ сделать это в «чистом» C #, не используя библиотеку MSAL, с которой у меня были некоторые проблемы.Поэтому, если вы ищете решение без MSAL, вы можете сделать это, как описано ниже.

Предварительные условия

  • Пользователь должен существовать вAAD и не должен использовать учетную запись Microsoft (источник в Active Directory не должен быть «учетной записью Microsoft»).
  • Клиентское приложение должно быть зарегистрировано в Azure Active Directory.Клиентскому приложению должны быть предоставлены разрешения на приложение, которое вы хотите протестировать.Если клиентское приложение имеет тип «Native», секрет клиента не должен предоставляться.Если клиентское приложение имеет тип "Web app / api", необходимо указать секретный ключ клиента.В целях тестирования рекомендуется использовать приложение типа «Native» без секрета клиента.

  • Не должно быть двухфакторной аутентификации.

Код C #

Вы можете создать класс "JwtFetcher" и использовать такой код:

    public JwtFetcher(string tenantId, string clientId, string resource)
    {
        this.tenantId = !string.IsNullOrEmpty(tenantId) ? tenantId : throw new ArgumentNullException(nameof(tenantId));
        this.clientId = !string.IsNullOrEmpty(clientId) ? clientId : throw new ArgumentNullException(nameof(clientId));
        this.resource = !string.IsNullOrEmpty(resource) ? resource : throw new ArgumentNullException(nameof(resource));
    }

    public async Task<string> GetAccessTokenAsync(string username, string password)
    {
        var requestContent = this.GetRequestContent(username, password);

        var client = new HttpClient
        {
            BaseAddress = new Uri(ApplicationConstant.Endpoint.BaseUrl)
        };

        var message = await client.PostAsync(this.tenantId + "/oauth2/token", requestContent).ConfigureAwait(false);

        message.EnsureSuccessStatusCode();

        var jsonResult = await message.Content.ReadAsStringAsync().ConfigureAwait(false);
        dynamic objectResult = JsonConvert.DeserializeObject(jsonResult);

        return objectResult.access_token.Value;
    }

    private FormUrlEncodedContent GetRequestContent(string username, string password)
    {
        List<KeyValuePair<string, string>> requestParameters = new List<KeyValuePair<string, string>>()
        {
            new KeyValuePair<string, string>(ApplicationConstant.RequestParameterName.GrantType, ApplicationConstant.RequestParameterValue.GrantTypePassword),
            new KeyValuePair<string, string>(ApplicationConstant.RequestParameterName.Username, username),
            new KeyValuePair<string, string>(ApplicationConstant.RequestParameterName.Password, password),
            new KeyValuePair<string, string>(ApplicationConstant.RequestParameterName.ClientId, this.clientId),
            new KeyValuePair<string, string>(ApplicationConstant.RequestParameterName.Resource, this.resource)
        };

        var httpContent = new FormUrlEncodedContent(requestParameters);
        return httpContent;
    }

Тип предоставления для этого просто "пароль".

0 голосов
/ 18 февраля 2019

Комментарий Юунаса уже охватил большую часть того, что требуется.Просто добавив немного больше деталей.

  • Вы можете использовать MSAL (ссылка), чтобы написать приложение .NET Core, которое обращается к вашему API.
  • В пределахMSAL, вам нужно использовать аутентификацию по паролю имени пользователя (грант с правами доступа владельца ресурса) для получения токена JWT.Пожалуйста, никогда не используйте этот грант за пределами вашего тестового приложения.
  • В зависимости от того, как настроено ваше приложение, достаточно использовать только clientId API.Однако рекомендуется зарегистрировать отдельное приложение native .

Некоторые формулировки, которые помогут вам в этом:

  • ClientId: идентификаторклиентское приложение, которое запрашивает токен .
  • Область действия: область действия API, которую вы получаете для токена .Уже должен быть настроен где-то в вашем API.Обычно что-то с URI AppId.Возможные примеры могут выглядеть следующим образом:
    • https://<yourtenant>.onmicrosoft.com/<yourapi>/user_impersonation
    • https://<clientId-of-API>/.default
    • ...
  • Полномочия: Ваш AAD,например, https://login.microsoftonline.com/yourtenant.onmicrosoft.com

Пример кода для предоставления пароля из вики (больше примеров там):

static async Task GetATokenForGraph()
{
    string authority = "https://login.microsoftonline.com/contoso.com";
    string[] scopes = new string[] { "user.read" };
    PublicClientApplication app = new PublicClientApplication(clientId, authority);

        try
        {
            var securePassword = new SecureString();
            foreach (char c in "dummy")        // you should fetch the password
                securePassword.AppendChar(c);  // keystroke by keystroke

            result = await app.AcquireTokenByUsernamePasswordAsync(scopes, "joe@contoso.com",
                                                                   securePassword);
        }
        catch(MsalException)
        {
          // See details below
        }

    Console.WriteLine(result.Account.Username);
}
...