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吗?