从客户端注销时,在网址https://identity.acme.com/connect/endsession上收到错误....(完整的网址列在下方)
“您要查找的资源已被删除,名称已更改,或暂时无法使用。”
AccountController.Logout调用
await HttpContext.SignOutAsync("Cookies");
await HttpContext.SignOutAsync("oidc");
浏览器中的网址是:
https://identity.acme.com/connect/endsession?post_logout_redirect_uri=https%3A%2F%2Fadmin.acme.com%2Fsignout-callback-oidc&id_token_hint=eyJhbGciOiJSUzI1NiIsImtpZCI6IkQ1NjY2RURGQjNFM0M3MDdCNkJCRUFCNEU3NTU3Q0NDNTNBOTc2Q0IiLCJ0eXAiOiJKV1QiLCJ4NXQiOiIxV1p1MzdQanh3ZTJ1LXEwNTFWOHpGT3Bkc3MifQ.eyJuYmYiOjE1MjM4NTI5NDMsImV4cCI6MTUyMzg1NjU0MywiaXNzIjoiaHR0cHM6Ly9pZGVudGl0eS50eXBzeS5jb20iLCJhdWQiOiJ0eXBzeS1pbmRpdmlkdWFsIiwibm9uY2UiOiI2MzY1OTQ0OTczMzc2OTAzMjQuTkRFME5EVXlORFF0WldOaU9TMDBOMkkzTFRrM01UY3RZVFl3WldRNVl6UmpObUk1WkRkaE5UUmtNVGN0WWpjM1lTMDBPVE16TFdFeU5tSXRZekpqWW1SaFptWTBPV1EzIiwiaWF0IjoxNTIzODUyOTQzLCJhdF9oYXNoIjoidkZacmdQUUI2UHd5VzBDeUhCV3QzdyIsInNpZCI6IjFlYjQxYzgwYjhmNGUxMTQ4MjViNDhiNmY4OWE1ZWY3Iiwic3ViIjoiYTAxNjI0MzAtZWIyMi00MTU0LWJmNTktMGJhNDliZmQ0NzNkIiwiYXV0aF90aW1lIjoxNTIzODUyOTQxLCJpZHAiOiJsb2NhbCIsIkFzcE5ldC5JZGVudGl0eS5TZWN1cml0eVN0YW1wIjoiMGM1YzQyNTQtOTM4NS00MWFiLWI5MTktNDFhZjgyOTFlNjljIiwiT3JnYW5pc2F0aW9uIjoiRmFuZXRpYyIsImdpdmVuX25hbWUiOiJKdXN0aW4iLCJmYW1pbHlfbmFtZSI6IkRyZXJ1cCIsInJvbGUiOlsiU3R1ZGVudCIsIkFkbWluaXN0cmF0b3IiLCJNYW5hZ2VyIiwiQWRtaW4iLCJUeXBzeS1PcmciXSwicHJlZmVycmVkX3VzZXJuYW1lIjoianVzdGluZEB0eXBzeS5jb20iLCJuYW1lIjoianVzdGluZEB0eXBzeS5jb20iLCJlbWFpbCI6Imp1c3RpbmRAdHlwc3kuY29tIiwiZW1haWxfdmVyaWZpZWQiOnRydWUsImFtciI6WyJwd2QiXX0.ifQJVB25rAB3HP30F9vtRvzLZ9dHjORHX7cKoG6SLLR3WqGzpoCkjnq10ijffjj2QbsvjxRPvsYPgbVxISwP04V79RFTHqZI7Z39vsBSZSGeJnkhQLXCvMs9i6F4-aiHR9dF3KTMCMOXFfiG0stG69vIMPckUHuTh5yT5a_nFSL4lebLb5AOpPHto8TtTy6SvFOGp7uyXw7d_KVQ3U9lo4RTYvPVePgq9bZf1DcaOL_gutj2EmHVrNc9kDIQRxK4rTbjx2kFrxD2LauEmh-OXTdzjOqtXLQF2jRwV4sGvPImiBOt75vLMlJJUP8B7sEm61bR50hfOqpycm46PO_awryxWGvqItjrYe8P0OQtuaQghCkesjToW4_OPHHQJIX2jXLN3i0SvfmPEB41pqmP73cKvCjMAMeCllfZ8pfRwzsbzvWKYZ2jZkF4CT6zQq4pEGblEl12yC-I59gqRYozhxz1hiPep4KkgHZ40VRjCR5LNu8Mmx2qp8B7xwyfzes1r7VnCeMJJd7LNqRRdE6mszj7vaZdvHb8n7UDud1hzktYLoVUENodCo4KrGuD7QwT28q8IK2sbtcK_98aLap2WeXcuDMsP5zbrGS2Vb3N4YezdqEU7YJjvk9tvdMdafTYe4LKNaq-cDHVnJh_pmXJsL6odwz9eXkddJBPzhHXf6M&state=CfDJ8Pr81inWVH5OlYUuWwOTfYygcAOv4qo4Jl03Su6yhd8WHQz8m-LK-vBDM8CjSBrqjNLz4Qdqx8759Wpts3AsgHnf997vKLyWqQSOgTQPOpy5qyouRMRmHEsk-h5BnQR4_SHIkzo5_kgJQ0xROmsqUD4Aq3o0zYd-rI-GYHiii7P_&x-client-SKU=ID_NET&x-client-ver=2.1.4.0
据我所知,这已经工作了好几个月。我看不出会对此产生影响的代码有任何变化,因此怀疑它是环保的。
我已启用日志记录,并且/ connect / endsession似乎甚至没有被触发。记录所有其他事件。
在开发中,它可以工作,日志记录显示被调用的端点:
Endpoint enabled: "Endsession", successfully created handler: "IdentityServer4.Endpoints.EndSessionEndpoint"
Request path "/connect/endsession" matched to endpoint type "Endsession"
客户端在IdentityServer4 Config.cs中配置了正确的PostLogoutRedirectUris
PostLogoutRedirectUris =
{
"https://admin.acme.com/signout-callback-oidc"
},
有趣的是,如果我手动编辑Url以删除
post_logout_redirect_uri=https%3A%2F%2Fadmin.acme.com%2Fsignout-callback-oidc&
然后提交我已成功重定向到Identity Server到LoggedOut页面。
如果我删除
.AddOpenIdConnect("oidc", options =>
{
options.SignedOutRedirectUri = "https://admin.acme.com";
}
从startup.cs 然后我可以成功从客户端注销(但是不再有重定向后注销)
有人可以解释发生了什么吗?
更新 - 这是一个URL问题吗?
然后,我可以将state参数附加到重定向的Url,然后该过程完成 https://admin.acme.com/signout-callback-oidc?state=CfDJ8Pr81inWVH5OlYUuWwOTfYygcAOv4qo4Jl03Su6yhd8WHQz8m-LK-vBDM8CjSBrqjNLz4Qdqx8759Wpts3AsgHnf997vKLyWqQSOgTQPOpy5qyouRMRmHEsk-h5BnQR4_SHIkzo5_kgJQ0xROmsqUD4Aq3o0zYd-rI-GYHiii7P_&x-client-SKU=ID_NET&x-client-ver=2.1.4.0
网址(未更改)为2135个字符
这让我怀疑这是服务器不接受长网址的问题吗?
答案 0 :(得分:1)
我正在使用身份服务器4和asp.net核心进行测试,并且面临与URL长度相同的问题。我找到了一个可以帮助的替代方案。 AddOpenIdConnect()中有一个选项,您可以设置用于将用户代理重定向到身份提供程序的方法。 我将其设置为“FormPost”,现在请求使用POST而不是GET来调用endsession端点。
.AddOpenIdConnect("oidc", options =>
{
[...]
options.AuthenticationMethod = OpenIdConnectRedirectBehavior.FormPost;
}
答案 1 :(得分:0)
基于问题中概述的调试,我确定这似乎是Url长度的问题。
一个积极的结果是我不得不更深入地了解Identity Server的工作原理,并且我已经设法优化整体登录过程和速度,并改善我的整体实施。
总之 - 这些是我所做的一些改变:
不要返回
IdentityServerConstants.StandardScopes.Profile
设置
AlwaysIncludeUserClaimsInIdToken = false
并使用
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
提供您需要的声明(以及不返回我的客户未使用的声明)