asp.net-core - 身份服务器 4/connect/endsession 失败 "The resource you are looking for has been removed...."

标签 asp.net-core asp.net-identity identityserver4 openid-connect

  • 使用身份服务器 4
  • Asp.Net Core MVC 客户端成功登录
  • 从客户端注销时,url 上出现错误 https://identity.acme.com/connect/endsession ....(下面列出了完整的网址)

    “您要查找的资源已被删除、更名或暂时不可用。”

  • AccountController.Logout 调用
    await HttpContext.SignOutAsync("Cookies");
    await HttpContext.SignOutAsync("oidc");
    

    浏览器中的Url是:
    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 长度问题吗?
  • 我做了更多调查
  • 当我删除 post_logout_redirect_uri=https%3a%2f%2fadmin.acme.com%2fsignout-callback-oidc& 时,它并不总是有效 - 这是对我之前所说的澄清。
  • 如果我从 state=xxxx 开始删除所有内容,则接受该 url,Identity Server 运行并成功重定向回 https://admin.acme.com/signout-callback-oidc但是它缺少 state=xxxxx
  • 然后我可以将 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
  • Url(未更改)为 2135 个字符
  • 我还做了一个测试,将整个 url 中的一些字符缩短为 2095 个字符(取自 state=)并触发 Identity Server(但状态代码无效,因为我已经更改了它)
  • 因此,只要 url 超过 2095 个字符,它就会失败。

  • 这让我怀疑这是否是服务器不接受长网址的问题?

    最佳答案

    根据问题中概述的调试,我确定这似乎是 Url 长度的问题。

  • 我遵循了本文中的指导https://leastprivilege.com/2016/12/14/optimizing-identity-tokens-for-size/而这篇文章 https://leastprivilege.com/2017/11/15/missing-claims-in-the-asp-net-core-2-openid-connect-handler/而这篇文章 https://leastprivilege.com/2017/11/15/missing-claims-in-the-asp-net-core-2-openid-connect-handler/减少返回的声明数量,从而减少 token 的大小。
  • 这导致问题消失。
  • 我仍然不知道为什么这突然停止工作(注意 claim 的大小或数量没有改变)

  • 一个积极的结果是,我必须更深入地了解 Identity Server 的工作原理,并且我设法显着优化了整体登录过程和速度,并改进了我的整体实现。

    总而言之 - 这些是我所做的一些更改:

    不要回来
    IdentityServerConstants.StandardScopes.Profile
    


    AlwaysIncludeUserClaimsInIdToken = false
    

    并使用
    public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    

    提供您需要的声明(以及不返回我的客户未使用的声明)

    关于asp.net-core - 身份服务器 4/connect/endsession 失败 "The resource you are looking for has been removed....",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49849940/

    相关文章:

    asp.net-core - Entity Framework 核心: DbContextOptionsBuilder does not contain a definition for 'usesqlserver' and no extension method 'usesqlserver'

    asp.net - 使用 Web API 服务作为中央身份验证点

    c# - ASP.net Identity Framework - 重新发送确认电子邮件

    xamarin.forms - OidcClient2 - 在等待 LoginAsync 时关闭 IBrowser

    c# - 配置 Identity Server 以使用 ASP.NET Identity 角色

    visual-studio - 如何更改 VS 2017 RC .csproj 项目的目标框架(从核心到经典)?

    c# - ASP.NET。 Newtonsoft.Json.JsonSerializationException : 'Self referencing loop detected with type ' E_Store2021. Models.Product'

    c# - 继承IdentityUser时如何创建新用户

    identityserver4 - 为什么混合流是 IdentityServer 中 Web 应用程序的默认推荐选项?

    c# - 如何在 ASP.Net Core 6.0 中实现 HSTS header ?