1

Я пытаюсь создать конфигурацию ведущий-ведомый тип аутентификации с IdentityServer4 нижеMultiple IdentityServer Федерация: Ошибка Невозможно незащитил message.State

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 

Все мои приложения и апи укажут и аутентификации MyMasterIdentityServer0

Пользователи могут иметь возможность аутентификации с использованием любого из указанных выше поставщиков. Они могут выбрать имя пользователя/пароль, и в этом случае они должны быть перенаправлены на MySlaveIdentityServer1 (Basic Auth), или они могут выбрать с использованием Windows Auth, используя свою учетную запись AD, и в этом случае они будут перенаправлены на MySlaveIdentityServer2 (Windows Auth) , или выберите любого другого провайдера.

После того как пользователь прошел аутентификацию, он получает id_token от сервера провайдера и перенаправляется обратно в MyMasterIdentityServer0, где внешний пользователь ищутся с помощью поставщику и ProviderUserId, а затем отводилась access_token для доступа к приложениям/api на основе его разрешений.

Они Проблема я столкнулся в том, что конфигурация IdentityServer Master Ведомый не работает для меня и дает мне ошибку Невозможно незащитил message.State, когда пользователь перенаправляется обратно к главному серверу после аутентификации. Я попытался разобраться с проблемой, и AuthO также столкнулась с такой же ошибкой, которую недавно установили.

Ошибка Полученное

Исключение: Невозможно незащитил 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" 
    //}, 
}); 

Basic Auth Конфигурация сервера клиентского

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 ... даже сервер Облако Demo Идентичность работает нормально. Может ли кто-нибудь дать мне какие-либо советы или предложения?

ответ

2

Я считаю, что вы получаете ошибку Unable to unprotect the message.State, потому что один из ваших провайдеров OIDC пытается дешифровать/снять защиту с состояния сообщения другого. (Состояние сообщения - это просто случайная строка, которая поможет с безопасностью.)

Я предлагаю вам называть аутентификационные схемы для каждого поставщика OIDC, например и oidc-master. Затем внешние поставщики должны отправить вас обратно к соответствующим конечным точкам signin-oidc-demo и signin-oidc-master.

-

Оказывается, этот ответ был в основном, правильно.При использовании нескольких поставщиков РСИН нужны разные AuthenticationSchemes:

AuthenticationScheme: РСИН Google

SignInScheme: IdentityServerConstants.ExternalCookieAuthenticationScheme

Callback: /-РСИН для входа в аккаунт Google-

И

AuthenticationScheme : oidc-microsoft

SignInScheme: IdentityServerConstants.ExternalCookieAuthenticationScheme

Callback: /-РСИН зарегистрировались-Microsoft

Если вы dont't дифференцируемые поставщиков РСИН, они могут попытаться войти в систему с той же схеме, и криптография не будет соответствовать, и только первый РСИН провайдер, зарегистрированный в вашем коде, будет работать.

+0

После звонка с Тревисом он выяснил, что схемы аутентификации в моих конфигурациях переопределяют друг друга и вызывают ошибку. Я опубликую обновление до более полного заявления о проблеме и решения в ближайшее время –