0

私はIdentityServer4で作業し、同じタイプの複数の外部プロバイダ(私の場合はOpenIdConnect)を追加しようとしています。しかし私はいくつかの問題にぶち当たっています。同じタイプの複数のAuthenticationSchemesをサポートします。

services.AddAuthentication() 
// Azure AD 
.AddOpenIdConnect("oidc", "Azure AD", x => 
{ 
    x.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme; 
    x.SignOutScheme = IdentityServerConstants.SignoutScheme; 
    x.ClientId = "some-client-id"; 
    x.Authority = "https://login.microsoftonline.com/common"; 
    x.ResponseType = OpenIdConnectResponseType.IdToken; 
    x.TokenValidationParameters = new TokenValidationParameters 
    { 
     ValidateIssuer = false 
    }; 
}) 
// Identity Server 
.AddOpenIdConnect("oidc", "My Other Identity Server", x => 
{ 
    x.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme; 
    x.SignOutScheme = IdentityServerConstants.SignoutScheme; 
    x.ClientId = "some-other-client-id"; 
    x.Authority = "http://localhost:6000"; //Another Identity Server I want to treat as external provider 
    x.RequireHttpsMetadata = false; 
    x.ResponseType = OpenIdConnectResponseType.IdToken; 
    x.TokenValidationParameters = new TokenValidationParameters 
    { 
     ValidateIssuer = true 
    }; 
}); 

原因:

Scheme already exists: oidc 
    at Microsoft.AspNetCore.Authentication.AuthenticationOptions.AddScheme(String name, Action`1 configureBuilder) 
    at Microsoft.AspNetCore.Authentication.AuthenticationBuilder.<>c__DisplayClass4_0`2.<AddScheme>b__0(AuthenticationOptions o) 
    at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options) 
    at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name) 
    at Microsoft.Extensions.Options.OptionsManager`1.<>c__DisplayClass5_0.<Get>b__0() 
    at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode) 
    at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) 
    at System.Lazy`1.CreateValue() 
    at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions) 
    at Microsoft.Extensions.Options.OptionsManager`1.Get(String name) 
    at Microsoft.Extensions.Options.OptionsManager`1.get_Value() 
    at Microsoft.AspNetCore.Authentication.AuthenticationSchemeProvider..ctor(IOptions`1 options) 
services.AddAuthentication() 
// Azure AD 
.AddOpenIdConnect("oidc", "Azure AD", x => 
{ 
    x.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme; 
    x.SignOutScheme = IdentityServerConstants.SignoutScheme; 
    x.ClientId = "some-client-id"; 
    x.Authority = "https://login.microsoftonline.com/common"; 
    x.ResponseType = OpenIdConnectResponseType.IdToken; 
    x.TokenValidationParameters = new TokenValidationParameters 
    { 
     ValidateIssuer = false 
    }; 
}) 
// Identity Server 
.AddOpenIdConnect("oidc-idserver", "My Other Identity Server", x => 
{ 
    x.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme; 
    x.SignOutScheme = IdentityServerConstants.SignoutScheme; 
    x.ClientId = "some-other-client-id"; 
    x.Authority = "http://localhost:6000"; //Another Identity Server I want to treat as external provider 
    x.RequireHttpsMetadata = false; 
    x.ResponseType = OpenIdConnectResponseType.IdToken; 
    x.TokenValidationParameters = new TokenValidationParameters 
    { 
     ValidateIssuer = true 
    }; 
}); 

私は彼らに異なるスキームを与えるとバック外部プロバイダの記事、そして私は、次の例外を取得します。

原因:

Exception: Correlation failed. 
    Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler+<HandleRequestAsync>d__12.MoveNext() 
+1

このシナリオをまだ試していないので、これについてはわかりません。両方のハンドラにCallbackPathを追加できますか?例えば。 '/ aad-callback'と'/idserver-callback'を実行します。両方のプロバイダの返信URLを少し異なるように設定する必要があります。 – juunas

+0

私はjunnasが正しいと思っています。「Correlation failed」というエラーは、各プロバイダのコールバックURLが違うためです。 私の場合は、ユーザーの電子メールドメインに関連付けられた設定に基づいてデータ駆動する必要があったので、Challengeメソッドに渡されたプロパティを必要とするすべての設定を受け入れることができる自分のミドルウェアを作成しました。 – mackie

答えて

0

コメンターは、ソリューションがようミドルウェアは、外部プロバイダが実行されているかを知ることができCallbackPathSignedOutCallbackPath特定を追加することで示唆したように。

関連する問題