C# 如何使用end session endpoint IdentityServer 4注销?
我已尝试使用从IdentityServer4文档获取请求从会话注销。 HttpResponseMessage如下所示: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
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。并在需要时使用刷新令牌获取新的承载。并在注销时删除该刷新令牌。