Статьи

Реализация единого входа Azure Active Directory в приложениях Xamarin для iOS

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

1. Аутентификация пользователей приложений iOS с помощью Azure Active Directory.
2. Как лучше всего обрабатывать токены доступа AAD в собственных мобильных приложениях.
3. Использование токена доступа Azure SSO для нескольких ресурсов AAD из собственных мобильных приложений
4. Совместное использование токена доступа Azure SSO между несколькими собственными мобильными приложениями

Краткое начало

Две недели назад группа Azure выпустила библиотеку ADAL (библиотека аутентификации ActiveDirectory), чтобы позволить разработчикам реализовать функцию единого входа в Azure AD. Это была отличная новость для меня, так как у меня есть несколько клиентов, которые заинтересованы в использовании этой функции в своих приложениях. В этом сообщении я поделюсь своим опытом внедрения единого входа Azure AD в приложениях Xamarin.iOS.

Аутентификация мобильного сервиса против ААД

Перво-наперво, если вы используете мобильные сервисы Azure, то аутентификация может выполняться для вас самой библиотекой мобильных сервисов Azure. Все, что вам нужно сделать, это передать ссылку на ваш RootViewController в библиотеку и вызвать LoginAsync () следующим образом:

// Initialize the Mobile Service client with your URL and key
client = new MobileServiceClient (applicationURL, applicationKey, this);
user = client.LoginAsync (_controller, MobileServiceAuthenticationProvider.WindowsAzureActiveDirectory);

Это даст вам объект пользователя (после аутентификации пользователя с помощью Azure), и вы сможете использовать этого пользователя для своих будущих вызовов. Это немного отличается от того, о чем мы будем говорить в этом посте. Дополнительные сведения об обработке проверки подлинности мобильных служб Azure можно найти в этом руководстве в библиотеке MSDN.

Azure AD Auth

Эта запись блога покажет вам, как вы можете аутентифицировать пользователей с помощью Azure AD. Это может быть полезно во многих случаях. Допустим, у вас есть мобильное приложение, и вы хотите, чтобы пользователи могли использовать это приложение только в определенной Active Directory (локальной или в Azure [1]). Или у вас может быть API, веб-сайт и т. Д. В Azure, и вы делитесь некоторыми функциями со своими мобильными пользователями с помощью собственного мобильного приложения. В обоих случаях вы можете использовать библиотеку ADAL, чтобы Azure AD мог обрабатывать аутентификацию пользователя за вас. Это очень удобно по следующим причинам:

1. Меньше разработки и сопровождения кода, поскольку Azure справляется с этим сам.
2. Гарантированная функциональность и меньше ошибок, поскольку это хорошо структурированная / протестированная библиотека из надежного источника (группа Azure).
3. Нет необходимости дополнительно обновлять свой apis при изменении api / sdks Azure.
4. Дополнительные функции и возможности, такие как кэширование токенов и операции обновления токенов.

Недостаток документации

На момент написания этого блога у меня было несколько проблем с документацией по Azure, когда я пытался внедрить SSO на Xamarin iOS. Документы (как показано здесь ) относятся к классам и методам, которых нет в библиотеке ADAL. Похоже, что это руководство взято из собственной реализации единого входа Azure для iOS (как можно увидеть здесь ) без каких-либо обновлений, соответствующих выпуску ADAL. Во всяком случае, достаточно жалоб, по этой причине у нас есть этот блог.:)

Реализация

Для реализации единого входа я предполагаю, что у меня есть собственное приложение, и я хочу аутентифицировать пользователей по моему AAD, прежде чем они смогут использовать это приложение. Для этого мне нужно сначала создать собственное приложение в Azure AD. Скриншоты ниже показывают это.

Добавление приложения в Azure AD

Добавление приложения в Azure AD

Обратите внимание, что имя приложения на самом деле не имеет значения, вы можете дать ему любое имя. Однако RedirectUrl должен быть действительным URI и должен быть уникальным. Фактически, это то, что Azure использует для аутентификации вашего мобильного приложения. Эти настройки могут быть изменены позже после создания мобильного приложения. Итак, предположим, что мы создали наше приложение в AAD. Прежде чем мы продолжим, давайте получим следующие детали:

Полномочия.
Представляет полномочия вашей AAD и соответствует формату https://login.windows.net/your-tenant-name. Где ваше имя арендатора может быть что-то .onmicrosoft.com

ClientId
Это идентификатор клиента собственного мобильного приложения, которое мы только что создали в AAD. Смотрите скриншот ниже.

Конфигурации приложения Azure AD

Конфигурации приложения Azure AD

URI перенаправления
Это уникальный идентификатор перенаправления приложения, которое мы только что создали, как показано на скриншоте выше.

Resource Id
Resource ID представляет Uri ресурса приложения, к которому мы пытаемся получить доступ. Так что, если мы пытаемся получить доступ к некоторым функциям веб-API, который также зарегистрирован в AAD, то этот идентификатор ресурса будет идентификатором клиента этого приложения веб-API.

Как только мы зарегистрируем приложение в AAD и получим всю информацию, указанную выше, все, что нам нужно, это просто написать несколько строк кода. Нам также необходимо установить пакет ADAL Nuget в наше приложение. На момент написания этого поста версия пакета nuget была 3.0.1102 … И она находится в Pre-Release . Обратите внимание, что это предварительная версия, поэтому по умолчанию она не будет указана в поиске пакета Nuget. Вам нужно было бы явно указать вашей IDE (Xamarin Studio или VS), чтобы показывались предварительные пакеты.

Время написать код. Небольшой фрагмент ниже показывает, как аутентифицировать пользователя и получить токен.
Ради этого поста в блоге нам нужно только аутентифицировать пользователя для лазури. Мы получим токен и сохраним его для будущего использования, у меня есть еще один пост, в котором говорится об использовании этого токена. Вы можете найти это здесь.

const string authority = "https://login.windows.net/your-tenant-name";
 const string resourceId = "your-resource-id";
 const string clientId = "your-native-app-client-id-on-AAD";
const string redirectUrl = "your-awsome-app-redirect-url-as-on-AAD";
 
    QSTodoService ()
    {
          // this line if very important as it enables the ADAL library to do all
          // IoC injection and other magic based on the platform that you are in.
          AdalInitializer.Initialize ();
    }
 
    public async Task AsyncInit(UIViewController controller, MySimpleStorage storage)
    {
        _storage = storage;
        _controller = controller;
 
        _authContext = new AuthenticationContext (authority);
    }
 
    public async Task<string> RefreshTokens()
    {
        var refreshToken = _storage.Get<string> (Constants.CacheKeys.RefreshToken);
        AuthenticationResult authResult = null;
        var result = "Acquired a new Token";
 
        if (string.IsNullOrEmpty (refreshToken)) {
            authResult = await _authContext.AcquireTokenAsync (
                resourceId, clientId, new Uri (redirectUrl), new AuthorizationParameters (_controller), UserIdentifier.AnyUser, null);
 
        } else {
            authResult = await _authContext.AcquireTokenByRefreshTokenAsync (refreshToken, clientId);
            result = "Refreshed an existing Token";
        }
 
        if (authResult.UserInfo != null)
            _storage.Save<string> (Constants.CacheKeys.Email, authResult.UserInfo.DisplayableId);
 
        _storage.Save<string> (Constants.CacheKeys.Token, authResult.AccessToken);
        _storage.Save<string> (Constants.CacheKeys.RefreshToken, authResult.RefreshToken);
 
        return result;
    }

Как видите, все очень просто. Вы можете сохранить ссылку на свой AuthenticationContext в своем приложении. Фактически, рекомендуется сделать это для дальнейшего использования, так как агрессивный GC на Monotouch может быстро избавиться от него.

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

Надеюсь, вы найдете это полезным и хотели бы услышать от вас, если у вас есть какие-либо отзывы. Я постараюсь загрузить исходный код этого примера на GitHub и поделиться ссылкой.

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

1. Аутентификация пользователей приложений iOS с помощью Azure Active Directory.
2. Как лучше всего обрабатывать токены доступа AAD в собственных мобильных приложениях.
3. Использование токена доступа Azure SSO для нескольких ресурсов AAD из собственных мобильных приложений
4. Совместное использование токена доступа Azure SSO между несколькими собственными мобильными приложениями