在 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)。
我实施了一个 单点登录 (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)。