gpt4 book ai didi

authentication - IdentityServer4 分别对每个客户端进行身份验证

转载 作者:行者123 更新时间:2023-12-04 01:56:58 24 4
gpt4 key购买 nike

我使用两个不同的客户端。 IdentityServer4 提供 API 保护和登录表单。我可以配置客户端以避免单点登录吗?我的意思是,即使我登录了第一个客户端,我也需要登录第二个客户端。

我的 ID4 配置:

internal static IEnumerable<Client> GetClients(IEnumerable<RegisteredClient> clients)
{
return clients.Select(x =>
{
var scopes = x.AllowedScopes.ToList();
scopes.Add(IdentityServerConstants.StandardScopes.OpenId);
scopes.Add(IdentityServerConstants.StandardScopes.Profile);
scopes.Add(IdentityServerConstants.StandardScopes.OfflineAccess);

var client = new Client
{
ClientId = x.Id,
ClientName = x.Name,
AllowedGrantTypes = GrantTypes.Hybrid,

RequireConsent = false,

RefreshTokenExpiration = TokenExpiration.Sliding,
RefreshTokenUsage = TokenUsage.ReUse,

ClientSecrets = {new Secret(x.Secret.Sha256())},
RedirectUris = new[] {$"{x.Url}/signin-oidc"},
PostLogoutRedirectUris = new[] {$"{x.Url}/signout-callback-oidc"},

UpdateAccessTokenClaimsOnRefresh = true,

AllowAccessTokensViaBrowser = true,
AllowedScopes = scopes,
AllowedCorsOrigins = {x.Url},
AllowOfflineAccess = true
};

return client;
});
}

所有客户端都有相同的注册码(也许这是一个问题):
const string oidcScheme = "oidc";
const string coockieScheme = CookieAuthenticationDefaults.AuthenticationScheme;

services.AddAuthentication(options =>
{
options.DefaultScheme = coockieScheme;
options.DefaultChallengeScheme = oidcScheme;
})
.AddCookie(coockieScheme)
.AddOpenIdConnect(oidcScheme, options =>
{
options.SignInScheme = coockieScheme;

options.Authority = identitySettings.Authority;
options.RequireHttpsMetadata = false;

options.ClientId = identitySettings.Id;
options.ClientSecret = identitySettings.Secret;

options.ResponseType = "code id_token";

options.Scope.Add("offline_access");
foreach (var scope in identitySettings.Scopes)
{
options.Scope.Add(scope);
}

options.GetClaimsFromUserInfoEndpoint = true;
options.SaveTokens = true;
});

任何帮助都会有用。

最佳答案

只要您在同一个浏览器 session 中,并且您的应用程序具有相同的权限(使用相同的身份服务器),这将不起作用。

我将向您解释原因——一旦您从第一个客户端登录,Identity Server 就会创建一个 cookie(其中包含所有需要的相关数据)。

现在是第二个客户端 - 权限(身份服务器)与发布 cookie 的权限相同。因此 Identity Server 识别您的 session ,看到您已经通过身份验证并将您重定向到第二个客户端,而无需提供凭据。

毕竟,这是 Identity Server 的想法:

IdentityServer4 is an OpenID Connect and OAuth 2.0 framework for ASP.NET Core 2.

It enables the following features in your applications:

Authentication as a Service

Centralized login logic and workflow for all of your applications (web, native, mobile, services). IdentityServer is an officially certified implementation of OpenID Connect.

Single Sign-on / Sign-out

Single sign-on (and out) over multiple application types.

and more....



这是来自 official documentation .

您必须为每个客户端选择不同的权限(Identity Server 实例),或者在这种情况下重新考虑 Identity Server 是否是适合您的解决方案。

不推荐

我不推荐这样做,因为它有点覆盖 Identity Server 的 SSO 想法,但是如果您仍然想这样做 - 如果您覆盖 IProfileService,您可以实现您想要的。 .有一个方法 public Task IsActiveAsync(IsActiveContext context)这个上下文有一个属性 IsActive它确定当前主体在当前客户端中是否处于事件状态。

您可以尝试在这里实现一些自定义逻辑,并根据用户 ID ( context.Subject.GetSubjectId() ) 和客户端 ID ( context.Client.ClientId ) 来确定用户是否已经登录到此客户端。

编辑

在您发表评论之后 - 这不是来自 Identity Server 的 OOTB(如果我可以这样说的话),但幸运的是您有一个选择。

Policy based authorization每个客户。像这样,您的用户可以对 Identity Server(及其所有客户端)进行身份验证,但只有特定的客户端才能向他授权。您可以将此策略视为自定义授权属性(或多或少)。

像这样,用户将在客户端中收到未经授权的信息,而他...希望这可以解决问题并有所帮助:)

关于authentication - IdentityServer4 分别对每个客户端进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49880489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com