0

IdentityServer4에서 작동하고 동일한 유형의 여러 외부 공급자 인 OpenIdConnect를 추가하려고 시도합니다. 그러나 나는 약간 문제점으로 달리고있다.동일한 유형의 여러 인증 스키마 지원

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 그래서 미들웨어가 실행되는 외부 프로 바이더를 알 수있는 특정 추가하는 것입니다 제안했다.