Несколько федераций IdentityServer: Ошибка Невозможно снять защиту сообщения. Состояние
Я пытаюсь создать основной тип ведомого устройства для аутентификации с 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 (базовая аутентификация), или они могут выбрать использование аутентификации Windows с использованием своей учетной записи AD, и в этом случае они будут перенаправлены на MySlaveIdentityServer2 (аутентификация Windows), или выбрать любую другой провайдер.
Как только пользователь прошел аутентификацию, он получает id_token с сервера провайдера и перенаправляется обратно на MyMasterIdentityServer0, где внешний пользователь просматривается с использованием Provider и ProviderUserId, а затем ему предоставляется access_token для доступа к приложениям / API на основе его разрешений.
Проблема, с которой я сталкиваюсь, заключается в том, что конфигурация IdentityServer Master Slave у меня не работает и выдает ошибку. Невозможно снять защиту с сообщения. Установить, когда пользователь перенаправляется обратно на главный сервер после аутентификации. Я попытался найти проблему, и AuthO также столкнулся с той же самой ошибкой, которую они недавно исправили.
Ошибка получена
Исключение: невозможно снять защиту с сообщения. Состояние
Конфигурация IdentityServer-Master
// 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"
//},
});
Базовая настройка клиента сервера аутентификации
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 работает нормально. Кто-нибудь может дать мне какой-нибудь совет или предложение?
1 ответ
Я верю, что вы получаете Unable to unprotect the message.State
ошибка, потому что один из ваших провайдеров OIDC пытается расшифровать / снять защиту состояния сообщения другого. (Состояние сообщения - это просто случайная строка, чтобы помочь с безопасностью.)
Я предлагаю, чтобы вы называли AuthenticationSchemes для каждого поставщика OIDC как oidc-demo
а также oidc-master
, Затем внешние поставщики должны отправить вас обратно в соответствующий signin-oidc-demo
а также signin-oidc-master
конечные точки.
-
Оказывается, этот ответ был в основном правильным. При использовании нескольких поставщиков OIDC вам нужны разные схемы аутентификации:
Схема аутентификации: oidc-google
SignInScheme: IdentityServerConstants.ExternalCookieAuthenticationScheme
Обратный звонок: /signin-oidc-google
А ТАКЖЕ
Схема аутентификации: oidc-microsoft
SignInScheme: IdentityServerConstants.ExternalCookieAuthenticationScheme
Обратный звонок: /signin-oidc-microsoft
Если вы не различаете поставщиков OIDC, они могут попытаться войти по той же схеме, и криптография не будет соответствовать, и будет работать только первый поставщик OIDC, зарегистрированный в вашем коде.