Мы хотим аутентифицировать пользователей нашего веб-приложения с помощью OAuth 2.0 через Azure B2C AD.Пользователи, управляющие B2C AD, будут поступать из разных источников, некоторые из которых мы создадим сами, но большинство подпишутся сами, и мы хотим включить других провайдеров идентификации, таких как Github или Google, следовательно, Azure B2C AD вместо Azure Active Directory.Мы также хотим объединить этих пользователей (включая некоторых самоподписавшихся) в группы.
Основной рабочий процесс аутентификации (включая процесс регистрации) работает: мы создали приложение в клиенте B2C,разрешил доступ через веб-API, сгенерировал секрет клиента и поток пользователей для входа в систему, регистрации и настройки наших сторонних поставщиков удостоверений.
Мы инициируем аутентификацию пользователя на https://<tenant>.b2clogin.com/tfp/<tenant>.onmicrosoft.com/<user-flow>/oauth2/v2.0/authorize?client_id=<client-id>&redirect_uri=<redirect-uri>&scope=<client-id>&response_type=code
.пользователь возвращается с действительным кодом авторизации, и мы используем его для запроса токена доступа у https://<tenant>.b2clogin.com/tfp/<tenant>.onmicrosoft.com/<user-flow>/oauth2/v2.0/token
, используя следующие данные POST:
{
"code":"<authorization-code>",
"client_id":"<client-id>",
"client_secret":"<client-secret>",
"redirect_uri":"<redirect-uri>",
"grant_type":"authorization_code"
}
Затем мы хотим использовать этот токен доступа для получения данных профиля пользователя (включая имя пользователя, адрес электронной почты и членство в группах) из API-интерфейса Azure AD Graph (https://graph.windows.net//me?api-version=1.6).) В документах прямо говорится, что каталоги B2C не должны использовать новый API-интерфейс Microsoft Graph https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet
API отвечает, что токенсрок действия истек:
<?xml version="1.0" encoding="utf-8"?><error
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><code>Authentication_ExpiredToken</code><message
xml:lang="en">Your access token has expired. Please renew it before
submitting the request.</message></error>
Но отметка времени в токене, декодированном https://jwt.ms/, говорит иначе:
{
"typ": "JWT",
"alg": "RS256",
"kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk"
}.{
"iss": "https://<tenant>.b2clogin.com/<id>/v2.0/",
"exp": 1553689573,
"nbf": 1553685973,
"aud": "<client-id>",
"idp": "github.com",
"name": "<username>",
"oid": "<oid>",
"sub": "<sub>",
"emails": [
"<email>"
],
"tfp": "B2C_1_SignupAndSignin",
"azp": "<client-id>",
"ver": "1.0",
"iat": 1553685973
}.[Signature]
However, aud
в токене - только наше приложение, а не API-интерфейс Azure AD Graph.Это говорит о том, что токен, выпущенный Azure B2C AD, просто недопустим для API Graph.
Поэтому мы задаемся вопросом, как правильно:
- получить токен доступадля пользователя B2C AD, который позволит нам получать информацию о пользователе
- читать профиль и членство в группах для аутентифицированного пользователя AD B2C
Некоторые ответы на Secure API с Azure AD/ B2C пользователи предлагают создать второе приложение для запроса Graph API.Это единственный способ достичь наших целей?