Многопользовательские приложения Azure AD - как реализовать проверку токенов? - PullRequest
0 голосов
/ 15 сентября 2018

У меня мультитенант Веб-приложение / API , зарегистрированный в объявлении Azure и подключенный к приложению API.Приложение API имеет настройку аутентификации Active Directory.На данный момент доступ к API имеет только один другой арендатор.Я убедился, что только они могут получить доступ, поместив https://sts.windows.net/<third party tenant>/ в Issuer URL .Мой вопрос: как бы я предоставил второму (или более) арендатору доступ к API?Я не могу больше добавлять идентификаторы арендаторов в URL-адрес эмитента , поэтому я немного растерялся

Спасибо

1 Ответ

0 голосов
/ 16 сентября 2018

Подход, который вы используете в настоящее время, будет работать только в одном сценарии арендатора, т. Е. Автоматическая проверка арендатора путем настройки IssuerURL работает только в одном сценарии арендатора.

В случае мультитенантных приложений, приложение отвечает за хранение и проверку всех возможных эмитентов. Это по проекту , и точное руководство по этой теме от Microsoft доступно здесь:

Работа с удостоверениями на основе утверждений в Azure AD: проверка эмитента

Для приложения с одним арендатором вы можете просто проверить, что эмитент ваш собственный арендатор. На самом деле, промежуточное ПО OIDC делает это автоматически по умолчанию. В мультитенантном приложении необходимо учитывать несколько эмитенты, соответствующие различным арендаторам. Вот общий подход к использованию:

  • В параметрах промежуточного программного обеспечения OIDC установите для ValidateIssuer значение false. Это отключает автоматическую проверку.
  • Когда арендатор регистрируется, сохраните арендатора и эмитента в своей пользовательской базе данных.
  • Всякий раз, когда пользователь входит в систему, ищите издателя в базе данных. Если издатель не найден, это означает, что арендатор не зарегистрировался. Вы можете перенаправить их на страницу регистрации.
  • Вы также можете занести в черный список определенных арендаторов; например, для клиентов, которые не оплатили свою подписку.

Так, в случае веб-приложения на основе .NET код в вашем классе запуска изменится на что-то вроде этого ... обратите внимание на new TokenValidationParameters {ValidateIssuer = false}

Аутентификация с использованием Azure AD и OpenID Connect

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions {
    ClientId = configOptions.AzureAd.ClientId,
    ClientSecret = configOptions.AzureAd.ClientSecret, // for code flow
    Authority = Constants.AuthEndpointPrefix,
    ResponseType = OpenIdConnectResponseType.CodeIdToken,
    PostLogoutRedirectUri = configOptions.AzureAd.PostLogoutRedirectUri,
    SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme,
    TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false },
    Events = new SurveyAuthenticationEvents(configOptions.AzureAd, loggerFactory),
});

После того, как вы отключили издателя Validate, вам нужно будет самостоятельно выполнить проверку. Вот пример с некоторыми рекомендациями о том, как выполнить эту проверку самостоятельно

Обновление кода для обработки нескольких значений эмитента

Перед тем, как разрешить вызов, вам, по крайней мере, нужно будет проверить заявление "tid", в котором записан идентификатор клиента Azure AD, по собственному списку действительных идентификаторов клиента.

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

Поскольку конечная точка / common не соответствует арендатору и не является эмитент, когда вы проверяете значение эмитента в метаданных для / общие он имеет шаблонный URL вместо фактического значения:

https://sts.windows.net/{tenantid}/

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

Например, если мультитенантное приложение разрешает вход только с конкретные арендаторы, которые подписались на их услуги, то он должен проверьте значение эмитента или значение требования tid в токене, чтобы убедитесь, что арендатор находится в их списке подписчиков. Если мультитенантное приложение работает только с физическими лицами и не любые решения о доступе на основе арендаторов, то он может игнорировать эмитента значение в целом.

(РЕДАКТИРОВАТЬ) Подробнее о проверке токенов Я пытаюсь ответить на ваши вопросы из комментариев здесь.

  1. Вот пример кода, который выполняет ручную проверку токенов JWT. Проверка токена доступа JWT вручную в веб-API

enter image description here

Полезный отрывок.

Проверка претензий, когда приложение получает токен доступа после входа в систему пользователь также должен выполнить несколько проверок претензии в токене доступа. Эти проверки включают, но не ограничено:

утверждение аудитории, чтобы убедиться, что идентификационный токен был предназначен для к вашему заявлению не ранее, а «истечение срока» претензий, для проверки что идентификатор токена еще не истек претензии эмитента, чтобы убедиться, что токен был выдан вашему приложению одноразовым номером конечной точки v2.0 как токен Защита от повторной атаки Рекомендуется использовать стандартную библиотеку. такие методы, как JwtSecurityTokenHandler.ValidateToken Method (JwtSecurityToken), чтобы сделать большую часть вышеупомянутой тяжелой работы. Вы может дополнительно расширить процесс проверки путем принятия решений на основе претензии полученные в токене. Например, мультитенантные приложения может продлить стандартную проверку путем проверки значения TID требование (ID арендатора) против набора предварительно выбранных арендаторов, чтобы гарантировать, что они только жетон чести от арендаторов по их выбору.

  1. Пример токена доступа, просто для понимания: Access Token и Id_token - это простые JSON-токены (JWT) в кодировке base64. Вы можете расшифровать их, чтобы найти претензии, а затем подтвердить их. Я делюсь примером, который имеет код, чтобы сделать это. Перед этим приведен пример токена доступа от одного из документов Microsoft. Я просто взял один, например, из здесь

Фактическое значение: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1N ... (длинная закодированная строка продолжается) Декодированное значение (вы можете легко проверить это, используя веб-сайт, например https://jwt.io):

{
  "aud": "https://service.contoso.com/",
  "iss": "https://sts.windows.net/7fe81447-da57-4385-becb-6de57f21477e/",
  "iat": 1388440863,
  "nbf": 1388440863,
  "exp": 1388444763,
  "ver": "1.0",
  "tid": "7fe81447-da57-4385-becb-6de57f21477e",
  "oid": "68389ae2-62fa-4b18-91fe-53dd109d74f5",
  "upn": "frankm@contoso.com",
  "unique_name": "frankm@contoso.com",
  "sub": "deNqIj9IOE9PWJWbHsftXt2EabPVl0Cj8QAmefRLV98",
  "family_name": "Miller",
  "given_name": "Frank",
  "appid": "2d4d11a2-f814-46a7-890a-274a72a7309e",
  "appidacr": "0",
  "scp": "user_impersonation",
  "acr": "1"
}

Как видите, декодированное значение имеет много утверждений, в том числе "tid", которые вы собираетесь проверить.

Надеюсь, это поможет!

...