c# - Identityserver4/OpenId Connect,混合模式, token 刷新失败

标签 c# asp.net-core-mvc openid-connect identityserver4

我有一个 ASP.net Core MVC 站点,它使用 OpenId 连接与另一个使用 IdentityServer4 的 ASP.net Core 站点进行身份验证,该站点使用另一个 IdentityServer4 站点作为身份提供者。

在客户端上,只有很少的页面,理论上可以只使用 AJAX 调用很长时间。我不希望网站刷新访问 token ,这样用户就不会被迫登录,比方说第二天。

我设置了一个计时器,它调用 MVC 站点上的 WebAPI 方法,刷新 token 。

它适用于前两次刷新,但总是在第三次刷新时失败。

该方法返回一个用于外部 API 调用的 JWT。我可以按预期在第一次调用时看到此更新,并且它获得了新的到期时间戳。

在第三次调用中,tokenClient.RequestRefreshTokenAsync 失败,因为 refreshToken 为空。

    public async Task<IActionResult> RefreshToken()
    {
        var disco = await DiscoveryClient.GetAsync(_authenticationOptions.Value.Authority);

        if (disco.IsError)
            return BadRequest(disco.Error);

        var tokenClient = new TokenClient(disco.TokenEndpoint, _authenticationOptions.Value.ClientId, _authenticationOptions.Value.ClientSecret);
        var refreshToken = await HttpContext.Authentication.GetTokenAsync(OpenIdConnectParameterNames.RefreshToken);
        var tokenResult = await tokenClient.RequestRefreshTokenAsync(refreshToken);

        if (tokenResult.IsError)
            return BadRequest(disco.Error);

        var old_id_token = await HttpContext.Authentication.GetTokenAsync(OpenIdConnectParameterNames.IdToken);
        var new_access_token = tokenResult.AccessToken;
        var new_refresh_token = tokenResult.RefreshToken;

        var tokens = new List<AuthenticationToken>();
        tokens.Add(new AuthenticationToken { Name = OpenIdConnectParameterNames.IdToken, Value = old_id_token });
        tokens.Add(new AuthenticationToken { Name = OpenIdConnectParameterNames.AccessToken, Value = new_access_token });
        tokens.Add(new AuthenticationToken { Name = OpenIdConnectParameterNames.RefreshToken, Value = new_refresh_token });

        var expiresAt = DateTime.UtcNow + TimeSpan.FromSeconds(tokenResult.ExpiresIn);
        tokens.Add(new AuthenticationToken { Name = "expires_at", Value = expiresAt.ToString("o", CultureInfo.InvariantCulture) });

        var info = await HttpContext.Authentication.GetAuthenticateInfoAsync("Cookies");
        info.Properties.StoreTokens(tokens);

        await HttpContext.Authentication.SignOutAsync("Cookies");
        await HttpContext.Authentication.SignInAsync("Cookies", info.Principal, info.Properties);

        return Ok(HttpContext.Authentication.GetTokenAsync("access_token").Result);
    }

我可以看到,Chrome 正在控制台中通知,set-cookie header 被忽略,因为它超过 4kb。

有什么建议吗?

最佳答案

明白了。

客户端 IdentityToken 已过期,并且由于该 api 方法不受 [Authorize] 属性保护,因此它没有更新 + 更改脚本以使用 iframe 而不是 AJAX 调用!

结案。

关于c# - Identityserver4/OpenId Connect,混合模式, token 刷新失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43052630/

相关文章:

c# - 从 FormClosing 事件设置属性值

c# - c#中不同选项卡的不同类

asp.net - 在ASP.NET Core MVC Razor View 中访问cookie值

oauth - .NET 核心 OpenId 连接服务器 : Sharing same token across multiple applications

java - Apache Oltu OAuthClient.accessToken() 因超时而失败

oauth-2.0 - [OAuth][Keycloak] invalid_grant session 在尝试使用 refresh_token 时未激活

c# - net core web api json 序列化 - 需要以 $ 为前缀的字段

c# - 正则表达式读取 HTML 中的标签

c# - TagHelper 从 ForExpression 获取 MaxLengthAttribute 属性

c# - 在 MVC6 中从外部程序集呈现 View