Идентификатор обновления Azure ADAL

Мы разрабатываем мультитенантное веб-приложение. Наши клиенты будут использовать Windows Azure Active Directory для аутентификации. Мы используем промежуточное ПО OWIN OpenIdConnect для аутентификации пользователей. В ответе, который мы получаем после процесса аутентификации, есть id_token и код авторизации.

Мы также хотим получить токен обновления, чтобы мы могли получать новые токены после истечения срока действия id_token. Поэтому в обработчике AuthorizationCodeReceived мы используем метод AcquireTokenByAuthorizationCode в библиотеке ADAL для получения токена обновления. Ответ содержит id_token, access_token и refresh_token.

Затем мы впоследствии используем referh_token для получения нового id_token, однако ответ содержит только обновленный access_token, но не обновленный id_token. Можно ли обновить id_token или мы можем обновить только access_token? Отрезанный код для обработчика полученного кода авторизации показан ниже.

AuthorizationCodeReceived = (context) =>
{
    string appBaseUrl = context.Request.Scheme + "://" + context.Request.Host + "/";
    var code = context.Code;
    string clientSecret = ConfigurationManager.AppSettings["ida:Password"];
    ClientCredential credential = new ClientCredential(clientId, clientSecret);
    string tenantID = context.AuthenticationTicket.Identity.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
    string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
    MAuthenticationContext authContext = new MAuthenticationContext(string.Format("https://login.windows.net/{0}", tenantID), null);
    AuthenticationResult result = authContext.AcquireTokenByAuthorizationCode(
                code, new Uri(appBaseUrl), credential, "https://graph.windows.net");

    AuthenticationResult refreshTokenResult = authContext.AcquireTokenByRefreshToken(result.RefreshToken, credential);

    return Task.FromResult(0);
},

person Gaurav    schedule 04.12.2014    source источник


Ответы (2)


Как правило, вы не можете использовать refresh_token для обновления id_token, потому что id_token представляет аутентификацию пользователя, информацию, которая не может быть обновлена ​​без присутствия пользователя. Способ обновления id_token описан в проекте управления сеансом OpenID Connect (http://openid.net/specs/openid-connect-session-1_0.html), т.е. путем повторной отправки пользователя (агента) в конечную точку авторизации с запросом аутентификации, который может включать «prompt = none», если вы не хотите никакого взаимодействия с пользователем, а просто проверьте с OP для существующего сеанса SSO.

Возможность управления сеансом, описанная в черновике спецификации, поддерживается Azure AD. Если вы хотите синхронизировать сеанс OP с сеансом приложения, это путь. OTOH вы можете выбрать сеанс приложения, независимый от сеанса OP, используя собственный тайм-аут и продолжительность сеанса, и в этом случае нет причин обновлять id_token. Затем id_token используется только для начальной загрузки сеанса приложения, который затем живет сам по себе.

person Hans Z.    schedule 04.12.2014
comment
Спасибо за ваш ответ. Причина, по которой я хотел обновить id_token, заключается в том, что я буду вызывать службы с id_token в заголовке авторизации. Поскольку время жизни токена составляет 3600 секунд, мне нужно будет снова получить id_token для последующих запросов. Для самого веб-приложения id_token действует как загрузчик. - person Gaurav; 04.12.2014
comment
Внутренняя служба может / должна быть клиентом OpenID Connect сама по себе, если вам важны время жизни id_token и семантика входа в систему. Если речь идет просто о передаче идентификатора пользователя в стандартизированной структуре (JWT), то бэкэнд может рассматривать его как простой JWT и игнорировать истечение срока, предполагая, что вызывающий абонент каким-либо образом аутентифицирован. - person Hans Z.; 04.12.2014

Также: AcquireTokenByRefreshToken на самом деле является резервным средством вручную на случай, если в автоматическом управлении кешем ADAL есть что-то, что вы не хотите выполнять. Как правило, каждый вызов AcquireToken * (кроме AcquireTokenByRefreshToken) будет автоматически использовать токен обновления, если это необходимо, и действительный токен в кеше. Если вы действительно не находитесь в особых случаях, я бы не советовал когда-либо использовать AcquireTokenByRefreshToken

person vibronet    schedule 04.12.2014
comment
Я заменил вызов AcquireTokenByRefreshToken на AcquireToken, и я заметил в скрипачей, что последующие вызовы AcquireToken получают обновленный токен и не выбирают его из кеша токенов. result = authContext.AcquireToken (graph.windows.net, учетные данные, новое UserAssertion (context.JwtSecurityToken.RawData)) ; - person Gaurav; 04.12.2014
comment
Гаурав, в вашем коде вы инициализируете контекст аутентификации нулевым значением в качестве кеша. Это указывает на то, что вы не хотите использовать какой-либо кеш, следовательно, он теряет токен обновления. У вас есть два варианта: один использует значение по умолчанию - ничего туда не передавать, и Adal будет использовать свой кеш OOB в памяти, а другой - передать настраиваемый кеш, как мы это делаем в наших примерах, что позволяет вам выбрать любое постоянство хранилище вам нравится. У нас есть различные образцы на github.com/azureadsamples с пользовательскими классами кеша. - person vibronet; 05.12.2014
comment
@vibronet мог бы AcquireTokenSilent сделать это? - person tatigo; 11.11.2015
comment
Acquiretokensilent использует кеш, да. - person vibronet; 11.11.2015