身份验证服务器在/connect/authorize/callback中一直显示“显示登录:用户未经身份验证”。

28

我正在使用IdentityServer4,在支持IdentityServer中只有ResourceOwnerPassword授权类型的现有系统上实施Code flow授权。

我遇到了一个阶段,用户被提示进行身份验证,然后重定向到server connect/authorize/callback

之后它没有进行身份验证并返回到登录页面。 从日志中,我得到了以下信息:

  1. 调用IdentityServer端点: IdentityServer4.Endpoints.AuthorizeCallbackEndpoint,位于/connect/authorize/callback

  2. ValidatedAuthorizeRequest

{
"ClientId": "demo",
"ClientName": "MVC Client Demo",
"RedirectUri": "http://localhost:5002/signin-oidc",
"AllowedRedirectUris": ["http://openidclientdemo.com:8001/signin-oidc",
"http://localhost:5002/signin-oidc"],
"SubjectId": "anonymous",
"ResponseType": "code id_token",
"ResponseMode": "form_post",
"GrantType": "hybrid",
"RequestedScopes": "openid profile default-api",
"State": "CfDJ8DU4Xalc7d9HttaFlZ-UaDhGsjeeEccTfNiNZFz3yYZI9MfXjrXo2TAzT9f6-F2VEdC7bWtcD7HRJgkqrh4t0oTAe_47IBfcm5Fsde9bVRorq-CHcL6_c15Vz1G5LJyEzqX6tyjhcZ2g3J2JjxD1PME1W7sq9YSddhQUJmxt4bVi70wdTtXXp0tH0SKyb0vLCs3eIjOln792nobaFOCM7r3VJ8BfXfpDm2pOOmBlR7zCCBxFCivwj7Zmy5Tu8Z09MvzOaLEkPBSL5i9GyxmGiB0P6osBPYEDyoRfgy2qDigH3QqLmLYjfE6NrgcgIGO9kgXuUT52XgALV_ZKjNbih-Y",
"Nonce": "636702233595840569.NGQ3NGVlODMtYTVhNy00MjM4LWFhNGQtNTFiZTE3ZjllZmUzNjU5MGNmNjktNjg3Yy00YmZlLWEwYWYtYmMzM2QxZmZlNjBk",
"Raw": {
    "client_id": "demo",
    "redirect_uri": "http://localhost:5002/signin-oidc",
    "response_type": "code id_token",
    "scope": "openid profile default-api",
    "response_mode": "form_post",
    "nonce": "636702233595840569.NGQ3NGVlODMtYTVhNy00MjM4LWFhNGQtNTFiZTE3ZjllZmUzNjU5MGNmNjktNjg3Yy00YmZlLWEwYWYtYmMzM2QxZmZlNjBk",
    "state": "CfDJ8DU4Xalc7d9HttaFlZ-UaDhGsjeeEccTfNiNZFz3yYZI9MfXjrXo2TAzT9f6-F2VEdC7bWtcD7HRJgkqrh4t0oTAe_47IBfcm5Fsde9bVRorq-CHcL6_c15Vz1G5LJyEzqX6tyjhcZ2g3J2JjxD1PME1W7sq9YSddhQUJmxt4bVi70wdTtXXp0tH0SKyb0vLCs3eIjOln792nobaFOCM7r3VJ8BfXfpDm2pOOmBlR7zCCBxFCivwj7Zmy5Tu8Z09MvzOaLEkPBSL5i9GyxmGiB0P6osBPYEDyoRfgy2qDigH3QqLmLYjfE6NrgcgIGO9kgXuUT52XgALV_ZKjNbih-Y",
    "x-client-SKU": "ID_NET",
    "x-client-ver": "2.1.4.0",
    "accessToken": "4155a526-2bb1-4d88-ba3a-21cb3a91f266",
    "userId": "MQ=="
}

}

  • 显示登录:用户未经过身份验证


  • 我不清楚是什么导致了身份验证失败,有任何想法吗?


    将日志中的异常发布出来。 - Tseng
    1
    @Tseng 没有异常!或者至少没有在日志中显示。 - Homam
    1
    你确定吗?IdSrv4应该记录一个错误或异常,提供更多信息,说明为什么认证请求失败了。 - Tseng
    1
    也许某个必需的声明没有被映射,通过路由用户最终到达登录页面。你想让用户前往的页面是否受到某个角色或策略的保护? - user4864425
    @Tseng,没有错误,我很确定。尽管我将标志 IdentityModelEventSource.ShowPII 设置为true。 - Homam
    显示剩余4条评论
    2个回答

    35
    TL;DR: 默认的IdentityServer使用http + Chrome不起作用。Chrome强制要求带有SameSite=none的cookie也必须具有Secure属性,因此您可能需要使用HTTPS或使用@blow's answer修改cookie策略。Chromium blog 有关单点登录和Cookie的一些背景信息,
    Cookie是服务器在响应中发送的信息片段,浏览器在每个后续请求上发送回来。
    当您登录到IdentityServer时,它会发送多个cookie,其中一个标识您的会话。该cookie被发送时带有SameSite=none属性,这允许您浏览的任何应用程序向您的IdentityServer发出请求并将其与之一起包含。这样,对/connect/authorize的调用将包括此cookie,IdentityServer将跳过登录部分。就这样,单点登录(SSO)实现了。
    您是否使用Google Chrome?
    Google Chrome最近推出了一项更改,即所有带有SameSite=none属性的cookie都必须包括Secure属性。
    这两个属性的含义是:
    • SameSite: 控制浏览器在基于来源时将cookie附加到任何请求时的行为。

      • SameSite=strict: 不会在来自与源不同的站点的请求中发送cookie。这有助于防止CSRF攻击。
      • SameSite=lax: 类似于strict,但只有在用户明确发起请求(通过单击链接或发送表单)时才会发送cookie,而不会在由脚本发起的请求上发送。
      • SameSite=none: 无论来自哪个源,都会包括cookie。
    • Secure: 表示cookie必须仅通过HTTPS发送。

    IdentityServer使用SameSite=none发出这些cookie。这意味着当您在本地没有使用HTTPS提供IdentityServer并使用chrome作为浏览器时,它不会登录您,因为在您向服务器POST用户和密码后,响应将包括会话cookie,但您的浏览器(chrome)将拒绝它们,因为它们未标记为secure,而是标记为SameSite=none此组合不允许


    1
    如果您在本地开发中使用HTTP重定向,会导致这种情况。客户端Web和ID服务器都必须使用HTTPS。试试看。 - MFARKAN
    1
    在IdentityServer中更改SameSite cookie行为是否可行?我想将SameSite设置为Lax或Strict。 - blow
    2
    谢谢,我通过设置CookiesPolicyOptions成功将SameSite设置为Lax。 - blow
    2
    我花了好几个小时来解决这个问题!阅读这篇文章的第一句话就解决了我的问题!谢谢你!!! - NickAndrews

    24

    问题的原因在于 Pablo Recalde 的回答,正确的解决方案是使用 HTTPS。

    无论如何,您可以通过设置 CookiesPolicyOptions 来更改 SameSite 值。

    将其设置为 SameSiteMode.Lax 可以强制至少使用 SameSite=Lax

    app.UseCookiePolicy(new CookiePolicyOptions { MinimumSameSitePolicy = SameSiteMode.Lax });
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接