在 IdentityServer4 客户端之间共享身份验证 cookie

Share authentication cookie between IdentityServer4 clients

我实施了一个 单点登录 (SSO),将两个应用程序作为客户端。 我希望用户通过 SSO 应用程序在第一个应用程序中进行身份验证,在第二个应用程序中不需要再次登录和身份验证。 (共享身份验证 cookie)。

信息:

localhost:44372 => SSO
localhost:44387 => SSO Client_1
localhost:44382 => SSO Client_2
All Projects are ASP.NET 5

SSO 项目代码:

Startup.cs:

 public void ConfigureServices(IServiceCollection services)
        {
            //...

            services.AddIdentityServer()
                .AddDeveloperSigningCredential()
                .AddInMemoryIdentityResources(Config.GetIndentityResources())
                .AddInMemoryClients(Config.GetClients())
                .AddTestUsers(TestUsers.Users);
        }

Config.cs:

  public class Config
    {
        public static IEnumerable<IdentityResource> GetIndentityResources()
        {
            //...
        }

        public static IEnumerable<Client> GetClients()
        {
            return new List<Client>()
            {
                new Client()
                {
                    ClientId = "Client_1",
                    ClientName = "SSO Application",
                    AllowedGrantTypes = GrantTypes.Implicit,
                    RedirectUris = {"https://localhost:44387/signin-oidc"},
                    PostLogoutRedirectUris = {"https://localhost:44387/signout-callback-oidc"},
                    AllowedScopes = new List<string>()
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile
                    }
                },
                 new Client()
                {
                    ClientId = "Client_2",
                    ClientName = "SSO Application 2",
                    AllowedGrantTypes = GrantTypes.Implicit,
                    RedirectUris = {"https://localhost:44382/signin-oidc"},
                    PostLogoutRedirectUris = {"https://localhost:44382/signout-callback-oidc"},
                    AllowedScopes = new List<string>()
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile
                    }
                }
            };
        }
    }

如何在客户端之间共享身份验证?

IdentityServer中的SSO不是通过共享cookie来实现的,而是通过Client授权给IdentityServer来实现的。您的客户端应用程序应使用授权端点通过 SSO 进行授权。 您还需要考虑使用 authorization_code grant_type https://medium.com/oauth-2/why-you-should-stop-using-the-oauth-implicit-grant-2436ced1c926

Cookie 共享与 Identityserver、OpenId Connect 或任何其他 SSO 技术无关。它是关于服务器托管的应用程序,例如 ASP.NET(Core)MVC 或任何其他类似的应用程序。
身份验证 cookie 绑定到主机和可选路径,因此当应用程序托管在一起时没有问题,但是 ASP.Net 将它的身份验证令牌保留在 cookie 中并且令牌通常是绑定的到 OIdC 会话,所以答案应该是:

When you would like to share the cookie in ASP.NET, you most likely do not need two separate clients in OIdC

一个选项是单一身份客户端,为两个应用程序提供重定向 URL,另一个选项是将您的两个应用程序合并为一个,并使用内部路由进行分离。

最后可能是你误解了单点登录的概念。它的设计正是为了满足您的要求:用户登录一次即可访问多个应用程序。它不需要共享任何东西,每个唯一的客户端都会获得自己的身份验证令牌(以及可选的一些授权令牌来访问 API)。