断言不在AspNetCore身份验证中的有效时间范围OpenIdConnect

时间:2016-11-18 13:50:18

标签: asp.net-core openid-connect adal

我在尝试获取另一个应用程序的令牌时开始收到此错误。

  

其他信息: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();

2 个答案:

答案 0 :(得分:0)

因为您将OnAuthorizationCodeReceived设置为ResponseType并且不会将授权代码发送给客户端而导致OpenIdConnectResponseType.IdToken未被解雇的原因。

  

其他信息:AADSTS70002:验证凭据时出错。 AADSTS50013:断言不在其有效时间范围内。

对于这个错误,请确保在您使用它为用户断言发送令牌请求之前访问令牌未过期。

答案 1 :(得分:0)

我在交换用户断言以获取 Microsoft Graph API 范围令牌时遇到了同样的问题,我发现 .Net Core Web API 允许过期令牌在其到期后还有 5 分钟,这是由于默认的 5 分钟令牌验证时钟偏差属性.

因此,我将 TokenValidationParameters 的 ClockSkew 属性设置为 TimeSpan.Zero,这阻止了过期的令牌请求,并且还解决了断言有效时间范围问题。