Как аутентифицировать пользователя с помощью Azure Active Directory с помощью OAuth 2.0?

У меня есть REST API, написанный на C #, и мне нужно пройти аутентификацию с помощью существующей службы Azure AD. В настоящее время у меня есть имя пользователя и пароль пользователя, желающего пройти аутентификацию. Мне нужно пройти аутентификацию в Azure AD и получить токен доступа с сервера.

Может ли кто-нибудь указать мне направление некоторых статей / руководств, в которых объясняется, как это сделать?


person COBOL    schedule 18.02.2015    source источник
comment
Вы имеете в виду, как использовать OAuth 2.0 с Azure AD? Процесс вызова по вызову описан здесь. Библиотека аутентификации Azure AD упрощает этот процесс.   -  person Panagiotis Kanavos    schedule 18.02.2015
comment
Спасибо - это именно то, что мне было нужно   -  person COBOL    schedule 18.02.2015
comment
Тот факт, что вы упомянули о наличии учетных данных пользователей, заставляет меня нервничать. Не могли бы вы добавить немного подробностей к своему вопросу. Это сценарий: собственное приложение - ›ваш REST API -› Azure AD Rest API. Или это: веб-приложение - ›ваш REST API -› Azure AD Rest API. Или что-то другое. В зависимости от конкретного сценария я могу указать вам на образцы, которые избавят вас от необходимости обрабатывать учетные данные пользователей, что было бы намного безопаснее с точки зрения безопасности.   -  person Rich Randall    schedule 19.02.2015


Ответы (2)


Вам следует избегать обработки учетных данных пользователей. При сборе учетных данных пользователей возникают серьезные проблемы с безопасностью, которые можно смягчить с помощью OAuth 2.0 или OpenID Connect для получения токена без непосредственной обработки учетных данных. Кроме того, если у вас есть собственный пользовательский интерфейс для сбора учетных данных, вы можете обнаружить, что в будущем вход в систему не будет выполнен, если включена многофакторная аутентификация. В этом случае для аутентификации пользователя может потребоваться больше информации, чем вы собираете, например, одноразовый пароль. Если вы разрешите Azure AD предоставлять аутентификацию через OAuth 2.0 или OpenID Connect, вы будете изолированы от конкретного используемого метода аутентификации. Сбор учетных данных пользователей Azure AD - это плохая практика, которой следует избегать, если это вообще возможно.

У меня недостаточно подробностей о точном сценарии, чтобы быть уверенным, что следующий пример применим, но он, по крайней мере, обеспечит хорошую отправную точку. В этом примере показано, как создать собственное приложение, которое вызывает REST API, который затем может вызывать ресурс Azure наиболее безопасным способом.

https://github.com/AzureADSamples/WebAPI-OnBehalfOf-DotNet

Здесь вы можете найти множество других примеров, которые можно использовать для построения решения для вашего конкретного сценария.

https://github.com/AzureADSamples

Если вы предоставите более подробную информацию, я могу дать более конкретное руководство.

person Rich Randall    schedule 19.02.2015
comment
Привет, у меня есть приложение для Android, которое отправляет имя пользователя и пароль в мой REST API. Затем REST API должен проверить правильность этой комбинации имени пользователя и пароля с помощью существующего сервера Azure AD. Если это правильно, REST API обработает создание токена доступа, который приложение будет использовать для связи с моим REST API. - person COBOL; 19.02.2015
comment
Пожалуйста, избегайте транспортировки имени пользователя и пароля. Везде, где вы обрабатываете имя пользователя и пароль, это еще одно потенциальное место для взлома учетной записи пользователя. Токены, возвращаемые из AAD, ограничены определенной областью. Если один из этих токенов скомпрометирован, серьезность взлома значительно меньше, чем скомпрометированный пароль имени пользователя. Почему вы собираете пароль для имени пользователя напрямую? Можно ли это изменить? - person Rich Randall; 23.02.2015
comment
Существуют ситуации, связанные с соответствием, когда приложениям необходимо проверять учетные данные в приложении для запроса. Кажется, нет никакого способа обойти это без получения кредитов из клиентского приложения и последующей проверки с помощью Azure на сервере (C # в клиентском приложении). - person im1dermike; 05.06.2017
comment
Я хотел бы лучше понять вашу ситуацию с соблюдением требований. Получение токена от AAD подразумевает, что учетные данные действительны. - person Rich Randall; 27.07.2017
comment
Замечательные аргументы в пользу отказа от передачи учетных данных пользователя в вашем приложении. Спасибо @RichRandall - person RyanOC; 01.03.2018
comment
Не уверен, почему это поднимается на голосование. Ответ на вопрос, выражающий свое мнение о вопросе, не является ответом. - person David; 28.01.2020

См .: http://www.cloudidentity.com/blog/2014/07/08/using-adal-net-to-authenticate-users-via-usernamepassword/

Сводка: создание UserCredential

UserCredential uc = new UserCredential(user, password);

Вызов одной из функций AcquireToken () с UserCredential

public AuthenticationResult AcquireToken(string resource, string clientId, UserCredential userCredential);
public Task<AuthenticationResult> AcquireTokenAsync(string resource, string clientId, UserCredential userCredential);
person dteviot    schedule 17.02.2016
comment
@ ivan.petrovic Ресурс: URI идентификатора приложения веб-API (защищенного ресурса). Чтобы найти URI идентификатора приложения веб-API, на портале управления Azure щелкните Active Directory, щелкните каталог, щелкните приложение, а затем щелкните Настроить. azure.microsoft.com/en-us / документация / статьи / - person sandiejat; 26.09.2016
comment
Из той же статьи: вы можете использовать эти потоки только из собственного клиента. Конфиденциальный клиент, такой как веб-сайт, не может использовать прямые учетные данные пользователя. - person Michael Freidgeim; 02.03.2017
comment
Если вы посмотрите на принятый ответ на этот вопрос: stackoverflow.com/questions/40498384/, вы увидите, как можно создать запрос RAW POST для использования учетных данных пользователя для получения токена. Это работает везде, где вы можете создать объект HttpClient для выполнения запроса ... - person Ian Robertson; 07.07.2017
comment
К сожалению, этот ответ позволяет приложению иметь доступ к имени пользователя и паролю пользователя. Лучшим способом было бы позволить провайдеру учетных данных проверить и вернуть токен, который приложение может попросить провайдер проверить. Таким образом, информация о пользователе остается между поставщиком и пользователем. - person nmishr; 24.02.2021
comment
@nmishr в исходном вопросе приложение имеет логин и пароль. - person dteviot; 25.02.2021