Asp.net core mvc 支持同一类型的多个身份验证方案

Asp.net core mvc 支持同一类型的多个身份验证方案,asp.net-core-mvc,openid-connect,identityserver4,asp.net-core-2.0,Asp.net Core Mvc,Openid Connect,Identityserver4,Asp.net Core 2.0,Im使用IdentityServer4进行工作,并尝试添加多个相同类型的外部提供程序,在我的例子中是OpenIdConnect。但是我遇到了一些问题 services.AddAuthentication() //Azure广告 .AddOpenIdConnect(“oidc”,“Azure AD”,x=> { x、 SignInScheme=IdentityServerConstants.ExternalCookieAuthenticationScheme; x、 SignOutScheme=I

Im使用IdentityServer4进行工作,并尝试添加多个相同类型的外部提供程序,在我的例子中是OpenIdConnect。但是我遇到了一些问题

services.AddAuthentication()
//Azure广告
.AddOpenIdConnect(“oidc”,“Azure AD”,x=>
{
x、 SignInScheme=IdentityServerConstants.ExternalCookieAuthenticationScheme;
x、 SignOutScheme=IdentityServerConstants.SignOutScheme;
x、 ClientId=“某些客户端id”;
x、 权威=”https://login.microsoftonline.com/common";
x、 ResponseType=OpenIdConnectResponseType.IdToken;
x、 TokenValidationParameters=新的TokenValidationParameters
{
validateisuer=false
};
})
//身份服务器
.AddOpenIdConnect(“oidc”,“我的其他身份服务器”,x=>
{
x、 SignInScheme=IdentityServerConstants.ExternalCookieAuthenticationScheme;
x、 SignOutScheme=IdentityServerConstants.SignOutScheme;
x、 ClientId=“其他一些客户端id”;
x、 权威=”http://localhost:6000“;//我要将另一个标识服务器视为外部提供程序
x、 RequireHttpsMetadata=false;
x、 ResponseType=OpenIdConnectResponseType.IdToken;
x、 TokenValidationParameters=新的TokenValidationParameters
{
validateisuer=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)
Exception: Correlation failed.
  Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler+<HandleRequestAsync>d__12.MoveNext()
如果我给他们不同的方案,那么当外部提供者发回时,我会得到以下异常

原因:

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)
Exception: Correlation failed.
  Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler+<HandleRequestAsync>d__12.MoveNext()
异常:关联失败。
Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler+d_u12.MoveNext()

正如评论员建议的那样,解决方案是添加特定的
回调路径
签名的OutCallbackpath
,以便中间件可以知道哪个外部提供者正在运行

services.AddAuthentication()
//Azure广告
.AddOpenIdConnect(“oidc”,“Azure AD”,x=>
{
x、 SignInScheme=IdentityServerConstants.ExternalCookieAuthenticationScheme;
x、 SignOutScheme=IdentityServerConstants.SignOutScheme;
x、 ClientId=“某些客户端id”;
x、 权威=”https://login.microsoftonline.com/common";
x、 ResponseType=OpenIdConnectResponseType.IdToken;
x、 TokenValidationParameters=新的TokenValidationParameters
{
validateisuer=false
};
//中间件正确关联的回调
x、 回调路径=新路径字符串(“/signin oidc az”);
x、 SignedOutCallbackPath=新路径字符串(“/signout oidc az”);
})
//身份服务器
.AddOpenIdConnect(“oidc idserver”,“我的其他身份服务器”,x=>
{
x、 SignInScheme=IdentityServerConstants.ExternalCookieAuthenticationScheme;
x、 SignOutScheme=IdentityServerConstants.SignOutScheme;
x、 ClientId=“其他一些客户端id”;
x、 权威=”http://localhost:6000“;//我要将另一个标识服务器视为外部提供程序
x、 RequireHttpsMetadata=false;
x、 ResponseType=OpenIdConnectResponseType.IdToken;
x、 TokenValidationParameters=新的TokenValidationParameters
{
validateisuer=true
};
//中间件正确关联的回调
x、 回调路径=新路径字符串(“/signin oidc so”);
x、 SignedOutCallbackPath=新路径字符串(“/signout oidc so”);
});

尚未尝试此方案,因此我对此不确定:能否尝试向两个处理程序添加回调路径?例如,
/aad回调
/idserver回调
。您需要在两个提供程序上配置不同的回复URL。我认为junnas是正确的,“关联失败”错误是因为没有为每个提供程序配置不同的回调URL。在我的例子中,我需要它基于与用户电子邮件域关联的配置进行数据驱动,因此创建了我自己的中间件,可以接受它所需的所有设置值以及传递给质询方法的属性。@eugene-s,在您的代码库的哪一部分中,您有逻辑选择一个oidc身份验证方案(“oidc”)或“oidc idserver”)?您可以共享该代码的外观吗?您必须使用ChallengeAsync并在方案中传递。您向用户展示该代码的方式是为每个方案呈现不同的按钮,然后引发ChallengeAsync。嗨,您能否显示或解释新端点的配置(CallbackPath、SignedOutCallbackPath),调用一些bsae signin oidc和signout oidc的新方法?特定的
CallbackPath
SignedOutCallbackPath
您将在目标身份提供商中配置为允许的站点。因此,当目标身份提供商发回时,它将发回您在
CallbackPath
和oidc mi中配置的路由ddle软件将选择要使用的正确配置。