Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.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# 如何使用end session endpoint IdentityServer 4注销?_C#_Asp.net_Identityserver4 - Fatal编程技术网

C# 如何使用end session endpoint IdentityServer 4注销?

C# 如何使用end session endpoint IdentityServer 4注销?,c#,asp.net,identityserver4,C#,Asp.net,Identityserver4,我已尝试使用从IdentityServer4文档获取请求从会话注销。 HttpResponseMessage如下所示: HttpResponseMessage res = await client.GetAsync($"connect/endsession?id_token_hint={idTokenHint}&post_logout_redirect_uri={postLogoutRedirectUri}"); var parameters = $"?id_token_hint={i

我已尝试使用从IdentityServer4文档获取请求从会话注销。 HttpResponseMessage如下所示:

HttpResponseMessage res = await client.GetAsync($"connect/endsession?id_token_hint={idTokenHint}&post_logout_redirect_uri={postLogoutRedirectUri}");
var parameters = $"?id_token_hint={idTokenHint}&post_logout_redirect_uri={postLogoutRedirectUri}";
HttpResponseMessage res = await client.GetAsync("connect/endsession" + parameters );
UseKestrel(options =>
{
  options.Limits.MaxRequestLineSize = 20480;
})
首先,我对Uri长度有一个问题。当我发送请求时,方法捕获异常

Invalid URI: The Uri scheme is too long. 
为了解决此问题,我尝试将参数发送到字符串中,如下所示:

HttpResponseMessage res = await client.GetAsync($"connect/endsession?id_token_hint={idTokenHint}&post_logout_redirect_uri={postLogoutRedirectUri}");
var parameters = $"?id_token_hint={idTokenHint}&post_logout_redirect_uri={postLogoutRedirectUri}";
HttpResponseMessage res = await client.GetAsync("connect/endsession" + parameters );
UseKestrel(options =>
{
  options.Limits.MaxRequestLineSize = 20480;
})
在Program.cs中添加MaxRequestLineSize,如下所示:

HttpResponseMessage res = await client.GetAsync($"connect/endsession?id_token_hint={idTokenHint}&post_logout_redirect_uri={postLogoutRedirectUri}");
var parameters = $"?id_token_hint={idTokenHint}&post_logout_redirect_uri={postLogoutRedirectUri}";
HttpResponseMessage res = await client.GetAsync("connect/endsession" + parameters );
UseKestrel(options =>
{
  options.Limits.MaxRequestLineSize = 20480;
})
我也试过这样做:但对我来说没什么用

我已经试着用邮递员发送这个请求。请求已发送

http://localhost:5000/connect/endsession?id_token_hint={idTokenHint}&post_logout_redirect_uri={postLogoutRedirectUri}
但在来自IClientStore接口clientId的FindClientByDaSync方法中,参数如下所示:

但在正常情况下,存在Id。我看不到它之前会发生什么,因为它是第一个入口点。
如何修复Uri长度和错误参数的问题?

问题很可能是查询参数中的无效字符:

?id_token_hint={idTokenHint}&post_logout_redirect_uri={postLogoutRedirectUri}
在本例中,我怀疑字符串postLogoutRedirectUri包含字符
,如果未转义,则该字符无效:
%3A

对uri进行编码:

var encodedUri = System.Web.HttpUtility.UrlEncode(postLogoutRedirectUri);
并将其用作参数:

?id_token_hint={idTokenHint}&post_logout_redirect_uri={encodedUri}

虽然这样可以解决问题,但为什么不使用?例如:


@鲁阿尔·范埃尔伯格非常感谢!Url现在有效。但注销的问题仍然没有解决,因为我使用了JWT令牌,不幸的是,常见的注销方法在我使用时并不适用于它们know@d_fLady在backchannel上调用endsession,因为她使用React->backend->IdentityServer体系结构,自己配置IdentityServer,并调用/connect/token或connect/endpoint等请求据我所知,这对我来说是正确的:)@Melianessa根本不适合通过反向通道工作:注销的想法是清除Idp+的身份验证cookie,通知当前会话期间登录的所有客户端——所有操作都需要访问浏览器,因此必须通过前端。这是默认的方式。您可以实现自己的。但在这种情况下,您需要开始考虑将idsrv会话持久化到某个自定义位置,而不是cookie。你真的需要吗?难以believe@Melianessa当您根本不需要idsrv中的会话时(仅一个应用程序,不需要SSO),请使用资源所有者密码流,注销时,只需清除应用程序中本地保留的令牌,不要触摸idsrv。这应该行得通。但在这种情况下,你不应该需要idsrv。。。不清楚again@Melianessajwt不能在到期前失效——这是出于设计。这就是为什么调用endsession端点对您没有帮助。这是关于会话、cookies和持久授权,而不是关于某人在某处坚持的JWT。你能做的就是设置尽可能短的ttl。并在需要时使用刷新令牌获取新的承载。并在注销时删除该刷新令牌。