gpt4 book ai didi

authentication - 多个IdentityServer联合: Error Unable to unprotect the message.状态

转载 作者:行者123 更新时间:2023-12-03 09:54:52 26 4
gpt4 key购买 nike

我正在尝试为IdentityServer4创建身份验证的主从类型配置,如下所示

MyMasterIdentityServer0 (Master) - receives id_token and gives access_token
|---> MySlaveIdentityServer1 (Basic Auth)
|---> MySlaveIdentityServer2 (Windows Auth)
|---> MySlaveIdentityServer3 (SmartCard Certificate Auth)
|---> MySlaveIdentityServer4 (SAML SSO Auth)
|---> Cloud Demo IdentityServer
|---> Google Auth
|---> Facebook Auth
|---> Microsoft Auth
|---> Twitter Auth

我所有的应用程序和api都将指向 并通过 MyMasterIdentityServer0 进行身份验证

用户可以使用上述任何提供程序选择身份验证。他们可以选择用户名/密码,在这种情况下,应将其重定向到 MySlaveIdentityServer1(Basic Auth),或者可以使用Windows Auth和AD帐户来选择使用Windows Auth,在这种情况下,应将其重定向到 MySlaveIdentityServer2(Windows Auth) ,或选择其他任何提供商。

用户通过身份验证后,他会从提供商服务器接收到id_token,然后重定向回 MyMasterIdentityServer0 ,在此使用Provider和ProviderUserId查找外部用户,然后根据其访问权限授予access_token来访问应用程序/api权限。

他们面临的问题是IdentityServer主从配置对我不起作用,并给我一个错误无法取消保护消息。在身份验证后将用户重定向回主服务器时,请指示。我尝试查找问题,并且AuthO也遇到了他们最近修复的同一错误。

收到错误

Exception: Unable to unprotect the message.State



IdentityServer-主配置
// WORKING
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
AuthenticationScheme = "ID4DemoCloud",
DisplayName = "Login with ID4DemoCloud",
SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme,
SignOutScheme = IdentityServerConstants.SignoutScheme,
Authority = "https://demo.identityserver.io/",
ClientId = "implicit",

TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
RoleClaimType = "role"
},
//Events = new OpenIdConnectEvents() { }
});

// NOT WORKING
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
AuthenticationScheme = "MySlaveIdentityServer1BasicAuth",
DisplayName = "Login with MySlaveIdentityServer1 Basic Auth",
SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme,
SignOutScheme = IdentityServerConstants.SignoutScheme,
Authority = "http://localhost:5100/",
ClientId = "MyMasterIdentityServer0",
ClientSecret = "secret",
RequireHttpsMetadata = false,

//TokenValidationParameters = new TokenValidationParameters
//{
// NameClaimType = "name",
// RoleClaimType = "role"
//},
});

基本Auth Server客户端配置
public static class Clients
{
public static IEnumerable<Client> GetClients()
{
return new[]
{
new Client
{
ClientId = "MyMasterIdentityServer0",
ClientName = "My Master IdentityServer 0",
ClientSecrets = new List<Secret> { new Secret("secret".Sha256()) },
AllowedGrantTypes = GrantTypes.Implicit,
AllowedScopes = new List<string>
{
StandardScopes.OpenId,
StandardScopes.Profile
},
RequireConsent = false,
AllowOfflineAccess = false,
RedirectUris = new [] { "http://localhost:5000/signin-oidc" }
}
};
}
}

除了内部部署的MySlaveIdentityServers 1、2、3和4以外,所有身份验证提供程序都工作正常,甚至Cloud Demo Identity服务器也可以正常工作。谁能给我任何意见或建议?

最佳答案

我相信您会收到Unable to unprotect the message.State错误,因为您的OIDC提供程序之一正在尝试解密/取消保护另一个的消息状态。 (消息状态只是一个随机字符串,以提高安全性。)

我建议您为每个OIDC提供程序(如oidc-demooidc-master)命名AuthenticationSchemes。然后,外部提供程序应将您发送回相应的signin-oidc-demosignin-oidc-master端点。

--

原来这个答案基本上是正确的。当使用多个OIDC提供程序时,您需要不同的AuthenticationSchemes:

AuthenticationScheme:oidc-google

登录方案:IdentityServerConstants.ExternalCookieAuthenticationScheme

回调:/signin-oidc-google



身份验证方案:oidc-microsoft

登录方案:IdentityServerConstants.ExternalCookieAuthenticationScheme

回调:/signin-oidc-microsoft

如果您不区分OIDC提供程序,则它们可能会尝试使用相同的方案登录,并且密码将不匹配,并且只有在您的代码中注册的第一个OIDC提供程序才可以使用。

关于authentication - 多个IdentityServer联合: Error Unable to unprotect the message.状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42404177/

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