Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Identity server 4处理过期或吊销的刷新令牌_C#_Asp.net Core_Oauth_Oauth 2.0_Identityserver4 - Fatal编程技术网

C# Identity server 4处理过期或吊销的刷新令牌

C# Identity server 4处理过期或吊销的刷新令牌,c#,asp.net-core,oauth,oauth-2.0,identityserver4,C#,Asp.net Core,Oauth,Oauth 2.0,Identityserver4,我正在使用Identity server 4系统。我们使用的是样本中的精确代码 问题在于这里的代码 当前,如果管理员吊销了refesh令牌,或者刷新令牌已过期(我们没有启用滑动刷新令牌),则应用程序将崩溃。我希望它将用户重新路由到登录屏幕 我在这个样本中遗漏了一些它无法处理的东西 我还将此作为问题发布在问题论坛上 当前尝试 是在检测到错误的地方添加以下内容 await context.HttpContext.SignOutAsync(CookieAuthenticationDefaults.Au

我正在使用Identity server 4系统。我们使用的是样本中的精确代码

问题在于这里的代码

当前,如果管理员吊销了refesh令牌,或者刷新令牌已过期(我们没有启用滑动刷新令牌),则应用程序将崩溃。我希望它将用户重新路由到登录屏幕

我在这个样本中遗漏了一些它无法处理的东西

我还将此作为问题发布在问题论坛上

当前尝试 是在检测到错误的地方添加以下内容

await context.HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
我希望这会让用户注销。这只是挂着,永远不会去任何地方。它甚至没有把你从服务器上注销

当前解决方案 目前我唯一能找到的远程工作方式是在api调用中添加一个catch。这并不理想,因为在我们的实际应用程序中,我们有很多api调用,这意味着对我们的应用程序进行很多更改。难道没有办法直接从中间层登录吗

[Authorize]
    public async Task<IActionResult> CallApi()
    {
        try
        {
            var token = await HttpContext.GetTokenAsync("access_token");

            var client = _httpClientFactory.CreateClient();
            client.SetBearerToken(token);

            var response = await client.GetStringAsync(Constants.SampleApi + "identity");
            ViewBag.Json = JArray.Parse(response).ToString();

            return View();
        }
        catch (Exception)
        {
            return new SignOutResult(new[] { "Cookies", "oidc" });
        }
    }
[授权]
公共异步任务CallApi()
{
尝试
{
var token=await HttpContext.GetTokenAsync(“访问令牌”);
var client=_httpClientFactory.CreateClient();
client.SetBearerToken(令牌);
var response=await client.GetStringAsync(Constants.SampleApi+“identity”);
Json=JArray.Parse(response.ToString();
返回视图();
}
捕获(例外)
{
返回新的SignOutResult(新[]{“Cookies”,“oidc”});
}
}

您只需添加一行即可强制中间件再次执行质询:

if(response.IsError)
{
_LogWarning(“错误刷新令牌:{Error}”,response.Error);
context.RejectPrincipal();
返回;
}

如何在客户端应用程序中管理用户的会话?如果您正在启动一个新的cookie会话,那么您应该结束它,以便将用户重定向到应用程序受保护区域的“外部”,并从那里再次启动登录流。当您尝试访问任何会话已过期的应用程序时,首先它似乎进入,但突然将您重定向到登录/主页。我尝试从AutomaticTokenManagementCookieEvents调用注销。它不起作用,只是挂起。如果这就是你的意思。我认为问题在于,从技术上讲,用户仍然使用过期的Oauth2刷新令牌登录其帐户。你真的是一个救生员。我已经用您的示例更新了示例代码。不知道为什么我没有想到这一点。
[Authorize]
    public async Task<IActionResult> CallApi()
    {
        try
        {
            var token = await HttpContext.GetTokenAsync("access_token");

            var client = _httpClientFactory.CreateClient();
            client.SetBearerToken(token);

            var response = await client.GetStringAsync(Constants.SampleApi + "identity");
            ViewBag.Json = JArray.Parse(response).ToString();

            return View();
        }
        catch (Exception)
        {
            return new SignOutResult(new[] { "Cookies", "oidc" });
        }
    }