身份服务器在/ connect / authorize / callback中始终显示“正在显示登录名:用户未通过身份验证”

时间:2018-08-18 21:38:51

标签: c# asp.net-core oauth-2.0 openid identityserver4

使用IdentityServer4,我正在现有系统上实现代码流授权,该系统仅支持IdentityServer中的ResourceOwnerPassword授予类型,并且运行良好。

我进入了一个阶段,其中升级了用户进行身份验证,然后将其重定向到server connect/authorize/callback

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

  1.   

    调用IdentityServer端点:/ connect / authorize / callback的IdentityServer4.Endpoints.AuthorizeCallbackEndpoint

  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=="
    }
    

    }

  3.   

    显示登录名:用户未通过身份验证


我不清楚是什么原因导致身份验证失败,知道吗?

2 个答案:

答案 0 :(得分:18)

TL; DR :使用http + chrome的默认身份服务器不起作用。 Chrome强制使用SameSite=none的cookie也具有Secure属性,因此您可能必须使用HTTPS或使用@blow's answer修改cookie策略。 Chromium blog

关于单点登录和cookie的一些背景信息,

cookie是服务器在response上发送的信息,浏览器在随后的每个request上发送回的信息。

当您登录到Identityserver时,它将发送回多个cookie,其中一个cookie标识您的会话。将使用属性SameSite=none发送该cookie,这将允许您浏览的任何应用程序向您的身分服务器发出请求,并将该cookie包括在内。这样,对/connect/authorize的调用包括此cookie,并且Identityserver跳过登录部分。 Voilà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作为浏览器时,它将无法登录,因为在将您的用户名和密码发布到服务器后,响应将包括会话cookie,但您的浏览器(chrome)会拒绝,因为它们没有标记为secure,而是标记为SameSite=noneand this combination is not allowed

答案 1 :(得分:13)

Pablo Recalde answer解释了原因,正确的解决方案是使用HTTPS。

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

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

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