我在尝试获取另一个应用程序的令牌时开始收到此错误。
其他信息:AADSTS70002:验证凭据时出错。 AADSTS50013:断言不在其有效时间范围内。
这是在我从AspNetCore的1.0.1升级到1.1.0之后开始的。如果我清除了我的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 :(得分:0)
因为您将OnAuthorizationCodeReceived
设置为ResponseType
并且不会将授权代码发送给客户端而导致OpenIdConnectResponseType.IdToken
未被解雇的原因。
其他信息:AADSTS70002:验证凭据时出错。 AADSTS50013:断言不在其有效时间范围内。
对于这个错误,请确保在您使用它为用户断言发送令牌请求之前访问令牌未过期。
答案 1 :(得分:0)
我在交换用户断言以获取 Microsoft Graph API 范围令牌时遇到了同样的问题,我发现 .Net Core Web API 允许过期令牌在其到期后还有 5 分钟,这是由于默认的 5 分钟令牌验证时钟偏差属性.
因此,我将 TokenValidationParameters 的 ClockSkew 属性设置为 TimeSpan.Zero,这阻止了过期的令牌请求,并且还解决了断言有效时间范围问题。