2016-11-18 2 views
0

Я начал получать эту ошибку при попытке получить токен для другого приложения.Утверждение не соответствует допустимому диапазону времени в аутентификации AspNetCore OpenIdConnect

Дополнительная информация: AADSTS70002: Ошибка проверки учетных данных. AADSTS50013: Утверждение не соответствует допустимому диапазону времени.

Это началось после того, как я обновился с 1.0.1 до 1.1.0 AspNetCore. Если я очищу свои файлы cookie, эта ошибка исчезнет некоторое время.

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

var userObjectId = (user.FindFirst(AuthSettings.UserObjectIdClaimName))?.Value; 
AuthenticationResult authResult = null; 
var authContext = GetAuthContext(userObjectId); 
ClientCredential credential = new ClientCredential(AuthSettings.ClientId, AuthSettings.ClientSecret); 
var claimsIdentity = user.Identity as ClaimsIdentity; 

var token = claimsIdentity?.BootstrapContext as string; 
if (token != null) 
{ 
    try 
    { 
     authResult = await authContext.AcquireTokenAsync(appId, credential, 
      new UserAssertion(token)); // Error here 
    } 
    catch (Exception) { } 

} 
if (authResult == null) 
{ 
    // Error no token in cache here 
    authResult = await authContext.AcquireTokenSilentAsync(appId, credential, 
     new UserIdentifier(userObjectId, UserIdentifierType.UniqueId)); 
} 


return authResult.AccessToken; 

Вы знаете, что интересно, что AcquireTokenSilentAsync, что происходит, если первая попытка не удается и не работает, потому что кэш Токен пуст. В моем старте у меня есть код в OnAuthorizationCodeReceived, который идет вперед и сохраняет токен в кеше токенов. Этот обратный вызов никогда не выполнен. Предположительно, если эта первая партия кода не работает, тогда резерв будет обрабатываться, если этот код сделал.

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions 
{ 
    ClientId = authSettings.ClientId, 
    Authority = authSettings.Authority, 
    ResponseType = OpenIdConnectResponseType.IdToken, 
    PostLogoutRedirectUri = authSettings.PostLogoutUrl, 
    TokenValidationParameters = new TokenValidationParameters() 
    { 
     SaveSigninToken = true 
    }, 
    Events = new OpenIdConnectEvents 
    { 
     OnRemoteFailure = authHelper.CreateOnRemoteFailureRedirectHandler("/Home/Error"), 
     OnAuthorizationCodeReceived = 
      authHelper.CreateOnAuthorizationCodeRecievedAcquireAdditionalTokenHandler(new[] { CustomerManagerApi }) 
    }, 
}); 

Это код, который в настоящее время не выполняется для OnAuthorizationCodeRecieved:

var userObjectId = (context.Ticket?.Principal?.FindFirst(AuthSettings.UserObjectIdClaimName))?.Value; 
var clientCred = new ClientCredential(AuthSettings.ClientId, AuthSettings.ClientSecret); 
var authContext = new AuthenticationContext(AuthSettings.Authority, TokenCacheCreator(userObjectId)); 
var redirectAddressForAuthCode = new Uri(context.Properties.Items[OpenIdConnectDefaults.RedirectUriForCodePropertiesKey]); 
authContext.AcquireTokenByAuthorizationCodeAsync(context.ProtocolMessage.Code, redirectAddressForAuthCode, clientCred, applicationId); 

context.HandleCodeRedemption(); 

ответ

0

Причина, по которой OnAuthorizationCodeReceived не был уволен, потому что вы установили ResponseType в OpenIdConnectResponseType.IdToken, который не будет посылать код авторизации клиента ,

Дополнительная информация: AADSTS70002: Ошибка проверки учетных данных. AADSTS50013: утверждение не находится в пределах допустимого диапазона времени.

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

+0

Я отказался от Microsoft.AspNetCore.Authorization 1.0.0, и все мои проблемы ушли. Кроме того, теперь я понимаю, что OnAuthorizationCodeReceived даже не нужен, что в этом примере используется логин для запроса GraphApi. Я думаю, что это всего лишь ошибка. –

+0

Пожалуйста, зарегистрируйте проблему в репозитории безопасности :) – blowdart

Смежные вопросы