Основы аутентификации в API Backend (.NET Core) с использованием Azure AD - PullRequest
0 голосов
/ 18 мая 2018

Возможно, вопрос более всеобъемлющий, чем заголовок.Есть много постов об аутентификации, токенах, JWT, Azure AD и т. Д., Но все эти посты, кажется, рассказывают другую историю, которая делает базовую концепцию, по крайней мере для меня, немного неясной.Я постараюсь объяснить мои вопросы, используя мой случай.

Я создал приложение Frontend с React в визуальном коде и приложение Backend в Visual Studio .Net Core 2 (веб-API).Приложение размещается в Azure, и мы хотели бы выполнить проверку подлинности с помощью Azure AD.

Интерфейс использует Adal-React (https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-authentication-libraries) и Axios (https://github.com/axios/axios).
). С помощью обучающих программ я настроил конфигурацию в интерфейсе и в API (бэкэнд),используя именно TenantID и ClientID, которые перечислены в среде Azure.

Хотя я настроил его и он работает, способ его работы мне более или менее неясен.

Я попытаюсь объяснить текущий рабочий процесс в моих приложениях, как он есть, и перечислил мои текущие вопросы ниже:

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

  const adalConfig = {
         tenant: 'vhsprod.onmicrosoft.com',
         clientId: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx',
         endpoints: {
          api: 'https://xxxxx.onmicrosoft.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx (client id)',
         },
         postLogoutRedirectUri: window.location.origin,
         redirectUri: 'http://localhost:3000/user-form',
         cacheLocation: 'sessionStorage'
        };
        export const authContext = new AuthenticationContext(adalConfig);
        export const getToken = () => {
         return authContext.getCachedToken(authContext.config.clientId);
        };

2 - пользовательНужно войти в систему и проверяется, существует ли пользователь в среде Azure AD, если это так, то пользователь перенаправляется обратно на веб-интерфейс, и мы получаем себе токен .

3 - Пользователь открывает форму / страницу во внешнем интерфейсе, для которой требуются данные из внутреннего интерфейса, выполняется вызов API с только что полученным токеном.Вызов выполняется с помощью Axios во внешнем интерфейсе, Axios также настроен:

export const axiosCallToMyAPI = axios.create({
  baseURL: 'http://localhost:52860/api/',
  timeout: 5000,
  headers: {'Authorization': 'Bearer ' + initialToken}
});

Исходный токен поступает от Adal, токен, который мы только что получили:

let initialToken = sessionStorage.getItem('adal.idtoken')

4 - выполняется вызов API, и здесь мы также настроили конфигурацию (appsettings.json) для использования Azure AD:

"AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "TenantDomain": "xxxx.onmicrosoft.com",
    "TenantId": "xxxx.onmicrosoft.com",
    "ClientId": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxx"
  }

5 - В классе запуска API токен проверяется:

services
                .AddAuthentication(sharedOptions =>
                {
                    sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                    sharedOptions.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; 
                    sharedOptions.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; 
                })
                .AddJwtBearer(options =>
                {
                    options.Audience = this.Configuration["AzureAd:ClientId"];
                    options.Authority = $"{this.Configuration["AzureAd:Instance"]}{this.Configuration["AzureAd:TenantId"]}";

                    options.Events = new JwtBearerEvents()
                    {

                        OnTokenValidated = context =>
                        {
                            return Task.CompletedTask;
                        }
                    };
                });

Остались вопросы и сделанные мной предположения (чтение нескольких постов):

  • С токеном Azure, который получает интерфейс, выполняется вызов API, как API узнает, что этот токен «действителен»?Я знаю, что класс запуска API использует событие OnTokenValidated, но в чем заключается магия этого ?Это просто проверка настроенного идентификатора клиента / клиента в appsettings с полученным токеном?
  • В нескольких сообщениях они используют / упоминают SecretKey / Signing Key, в моем примере, однако, я не реализовал SecretKey, но он все еще работает.Нужно ли реализовывать секретный / подписывающий ключ в моем API (бэкэнд)?Это необходимо?
  • Я также прочитал о неявном потоке, OpenID connect и некоторых других терминах.Когда вы используете аутентификацию Azure AD, как в моем примере, и делаете это таким образом, я автоматически выполняю implicit flow (frontend -> backend) и аутентификацию с openid connect?Другими словами, когда вы используете аутентификацию Azure, вы автоматически выполняете эти / передовые практики или все-таки должны их реализовать?
  • У токена есть определенные претензии /.определены области, которые предоставляются Azure (где вы также можете установить эти утверждения, такие как электронная почта и роли), однако при использовании AspNet (Identity) вы также можете добавить свои собственные утверждения в текущий токен / сеанс, например, когда я добавляю ролевой запросот незаметности до моего жетона.Чем эти претензии отличаются от первоначальной претензии (все еще предъявитель / JWT?) И является ли это хорошей практикой?

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

Приношу свои извинения, если история немного общая, но в настоящий момент наш уровень пробных ошибок слишком высок, и я просто пытаюсь прояснить ситуацию.

1 Ответ

0 голосов
/ 18 мая 2018

С токеном Azure, который получает интерфейс, выполняется вызов API, как API узнает, что этот токен «действителен»?Я знаю, что класс запуска API использует событие OnTokenValidated, но что за магия стоит за этим?Это просто проверка настроенного идентификатора клиента / клиента в настройках приложения с помощью получаемого токена ??

Вы указали полномочия при настройке аутентификации.Обработчик аутентификации загружает метаданные OpenId Connect с URL-адреса, например, при запуске приложения: https://login.microsoftonline.com/joonasapps.onmicrosoft.com/.well-known/openid-configuration.

Оттуда оно получает открытые ключи подписи и действующий URI эмитента.

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

В нескольких сообщениях они используют / упоминаютSecretKey / Signing Key, в моем примере, однако, я не реализовал SecretKey, но он все еще работает.Нужно ли реализовывать секретный / подписывающий ключ в моем API (бэкэнд)?Это необходимо?

Проверьте выше.

Я также прочитал о неявном потоке, OpenID connect и некоторых других терминах.Когда вы используете аутентификацию Azure AD, как в моем примере, и делаете это таким образом, я автоматически выполняю неявный поток (frontend -> backend) и аутентификацию с помощью openid connect?Другими словами, когда вы используете аутентификацию Azure, вы автоматически выполняете эти / передовые практики или все-таки должны их реализовать?

Неявный поток означает, что клиент может получить токен доступа непосредственно из конечной точки авторизации, а не запрашивать его у конечной точки токена.Одностраничные приложения используют его со скрытыми фреймами для получения токенов доступа и обновления устаревших токенов.Это зависит от того, остается ли активным сеанс пользователя с Azure AD.Если у вас более «классическое» фоновое приложение, вы, вероятно, использовали бы поток кода авторизации вместо неявного потока.

Маркер имеет определенные утверждения /.определены области, которые предоставляются Azure (где вы также можете установить эти утверждения, такие как электронная почта и роли), однако при использовании AspNet (Identity) вы также можете добавить свои собственные утверждения в текущий токен / сеанс, например, когда я добавляю ролевой запросот незаметности до моего жетона.Чем эти претензии отличаются от первоначальной претензии (все еще предъявитель / JWT?) И является ли это хорошей практикой?

Ваше приложение не может изменить токен Azure AD, точка.Его подпись больше не будет действительной, если вы ее измените.Вместо этого ASP.NET Core Identity использует cookie + сеанс для хранения заявок для вошедшего в систему пользователя.Таким образом, итоговый сеанс пользователя будет содержать утверждения из токена, а также утверждения, хранящиеся в вашем пользовательском хранилище.

...