Несколько федераций 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, зарегистрированный в вашем коде.

Другие вопросы по тегам