Single sign on 从一个客户端A登录将在客户端B中创建默认cookie

Single sign on 从一个客户端A登录将在客户端B中创建默认cookie,single-sign-on,openid,identityserver4,Single Sign On,Openid,Identityserver4,我使用IdentityServer4作为授权服务器,我有两个客户端(A和B)。当我成功地从客户端A登录时,还会在客户端B上创建cookie。客户端B上的cookie不会重定向。顺便说一句,拥有它很好。但问题是我不想让客户对这些饼干有什么自己的主张。由于它没有通过通知->SecurityTokenValidated端点,因此我无法对客户端B使用自定义声明。如果我从客户端B登录,客户端A也会发生同样的情况 我需要知道客户端B上的cookie是如何创建的,以及如何在其上添加我自己的声明 更新的详细信息

我使用
IdentityServer4
作为授权服务器,我有两个客户端(A和B)。当我成功地从客户端A登录时,还会在客户端B上创建cookie。客户端B上的cookie不会重定向。顺便说一句,拥有它很好。但问题是我不想让客户对这些饼干有什么自己的主张。由于它没有通过
通知->SecurityTokenValidated
端点,因此我无法对客户端B使用自定义声明。如果我从客户端B登录,客户端A也会发生同样的情况

我需要知道客户端B上的cookie是如何创建的,以及如何在其上添加我自己的声明

更新的详细信息: 据我所知,OpenId connect的行为是从Auth Server(identityserver)请求授权,以防请求需要授权。在我的例子中,我在客户机B中有一个匿名页面,我在客户机A中登录后刷新该页面,并且仍然在客户机B中获取身份验证cookie,而不重定向到身份验证服务器

Client Config for Client A

{
    "ClientId": "nolib.client",
    "ClientName": "Web Form Test",
    "AllowedGrantTypes": [ "implicit" ],
    "ClientSecrets": [
      {
        "Value": "2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b"
      }
    ],
    "RedirectUris": [ "http://localhost:11716/account/signInCallback" ],


    "RequireClientSecret": false,

    "AllowedScopes": [
      "openid",
      "profile",
      "api1"
    ],
    "AllowOfflineAccess": true,
    "RequireConsent": false,
    "AllowAccessTokensViaBrowser": true
  }

Client B
  {
    "ClientId": "81117971101161171097797112115",
    "ClientName": "MVC client",
    "AllowedGrantTypes": [ "hybrid" ],
    "ClientSecrets": [
      {
        "Value": "2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b"
      }
    ],
    "RedirectUris": [ "http://localhost:6006/signin-oidc" ],
    "PostLogoutRedirectUris": [ "http://localhost:6006/signout-callback-oidc" ],

    "RequireClientSecret": false,

    "AllowedScopes": [
      "openid",
      "profile",
      "api1"
    ],
    "AllowOfflineAccess": true,
    "RequireConsent": true,
    "AllowAccessTokensViaBrowser": true
  }
更新2


通过几次测试,我发现我在客户端B中得到的这些cookie与创建的客户端A相同。类似地,如果我从客户端B登录,那么客户端A从客户端B获得相同的Cookies。这可能是因为我在本地主机中吗?但是我有不同的端口。此外,客户端A到B之间没有其他链接,只有来自身份验证服务器的链接。

Identity Server带有单点登录功能,这意味着如果用户在客户端A上登录一次,然后转到客户端B,则无需重新登录。但是,每个客户端都必须对自己进行身份验证,如果它验证cookie,则必须通过后台通道进行身份验证。然后它也为第二个客户端创建cookies。这就是你所看到的行为

不确定为什么不能为不同的客户端添加单独的cookie。因为特定于客户端的cookie不会共享。您可以在客户端配置中为客户端A添加声明,并为客户端B添加不同的声明。Identity server将尊重您的配置

更新-此图清楚地显示了不同客户端的不同cookie-“lmClient”是客户端A,“mvchybrid”是客户端B

记住它的localhost,如果您在浏览器上打开另一个具有相同域的选项卡localhost,您将看到相同的cookie。这些不是新的饼干。在您的评论中,您已经说过,如果您不设置Authorize属性,您仍然会得到cookies,这意味着它不会进入identity server,并且很可能您看到的是为客户端A创建的相同cookies,而不是新的cookies

正如我所说,尝试在中间件中为cookie命名,就像我所做的那样,如果您看到的是相同的cookie,它会给您一个想法

您可以在客户端启动类中这样设置它-

app.UseCookieAuthentication(new CookieAuthenticationOptions()
            {

                AuthenticationScheme = "Cookies",
                CookieName = "mvchybrid",
                AutomaticAuthenticate = true,
                AutomaticChallenge = false,
                Events = new CookieAuthenticationEvents()
                {
                    // validates with each http request
                    OnValidatePrincipal = ValidatePrincipal
                }
            });

Identity server具有单点登录功能,这意味着如果用户在客户端A上登录一次,然后转到客户端B,则无需重新登录。但是,每个客户端都必须对自己进行身份验证,如果它验证cookie,则必须通过后台通道进行身份验证。然后它也为第二个客户端创建cookies。这就是你所看到的行为

不确定为什么不能为不同的客户端添加单独的cookie。因为特定于客户端的cookie不会共享。您可以在客户端配置中为客户端A添加声明,并为客户端B添加不同的声明。Identity server将尊重您的配置

更新-此图清楚地显示了不同客户端的不同cookie-“lmClient”是客户端A,“mvchybrid”是客户端B

记住它的localhost,如果您在浏览器上打开另一个具有相同域的选项卡localhost,您将看到相同的cookie。这些不是新的饼干。在您的评论中,您已经说过,如果您不设置Authorize属性,您仍然会得到cookies,这意味着它不会进入identity server,并且很可能您看到的是为客户端A创建的相同cookies,而不是新的cookies

正如我所说,尝试在中间件中为cookie命名,就像我所做的那样,如果您看到的是相同的cookie,它会给您一个想法

您可以在客户端启动类中这样设置它-

app.UseCookieAuthentication(new CookieAuthenticationOptions()
            {

                AuthenticationScheme = "Cookies",
                CookieName = "mvchybrid",
                AutomaticAuthenticate = true,
                AutomaticChallenge = false,
                Events = new CookieAuthenticationEvents()
                {
                    // validates with each http request
                    OnValidatePrincipal = ValidatePrincipal
                }
            });

没错。但据我所知,这种行为只发生在授权请求中。我现在的问题是,我甚至不需要有授权的请求来获取cookies。我刷新了我的匿名页面,我已经有了Cookie。您是否在您的客户端上将Cookie身份验证选项AutomaticAuthenticate设置为true?没有。我已经更新了我的问题的客户端配置。嗯,所以如果我使用单独的域,这个问题就不存在了?我还想看看你的饼干中间件。谢谢你说得对。但据我所知,这种行为只发生在授权请求中。我现在的问题是,我甚至不需要有授权的请求来获取cookies。我刷新了我的匿名页面,我已经有了Cookie。您是否在您的客户端上将Cookie身份验证选项AutomaticAuthenticate设置为true?没有。我已经更新了我的问题的客户端配置。嗯,所以如果我使用单独的域,这个问题就不存在了?我还想看看你的饼干中间件。Thanksry从两个客户端的cookie中间件中为您的cookie命名,它将确保您看到的是相同的cookie还是不同的cookie。我看到的是相同的cookie。如果我在一个客户端中添加自定义声明,则它会出现在另一个客户端上。检查我的更新答案-您看到的是同一组cookie吗?尝试在两个客户端中从cookie中间件为您的cookie命名,它将确保您看到的是相同的cookie还是不同的cookie。我看到的是相同的cookie。如果我在一个客户机中添加自定义声明,则它会出现在另一个客户机上。请检查我的更新答案-您看到的是同一组cookie吗?