我有两个可以指向我的Web应用程序的URL。根据URL,我想更改要使用的OpenIdConect(OIDC)配置。 我希望能够在不重新启动应用程序的情况下完成这项工作。这个需求是在创建了web应用之后提出的,现在需要支持两个URL。
比方说,这两个URL是
原代码在 Startup.cs : ConfigureServices
:
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = oidcOptions.CookieSchemeName;
options.Authority = oidcOptions.AuthServerUrl;
options.ClientId = "ExternalClientId";
options.ClientSecret = oidcOptions.ClientSecret;
options.ResponseType = oidcOptions.ResponseType;
options.SaveTokens = true;
foreach (var claim in oidcOptions.RequestClaims)
{
options.Scope.Add(claim);
}
options.GetClaimsFromUserInfoEndpoint = true;
options.ClaimActions.DeleteClaim("sid");
options.Events.OnRedirectToIdentityProvider =
EventsOnRedirectToIdentityProvider(applicationOptions);
options.Events.OnRemoteFailure = EventsOnRemoteFailure();
})
现在,我的想法是增加代码的 Configure
方法,如果URL以 "内部 "开头,则使用 "内部 "的配置。 我对配置一个web应用来使用认证提供者比较陌生,所以不太了解各种可能性。
在研究这个问题的时候,发现了一个问题,那就是将第二个OIDC区块添加到 AddOpenIdConnect
这样,然后在 Configure
方法来切换到所需的配置 :
.AddOpenIdConnect("oidc-external", options =>
{
options.SignInScheme = oidcOptions.CookieSchemeName;
options.Authority = oidcOptions.AuthServerUrl;
options.ClientId = "ExternalClientId";
options.ClientSecret = oidcOptions.ClientSecret;
options.ResponseType = oidcOptions.ResponseType;
options.SaveTokens = true;
foreach (var claim in oidcOptions.RequestClaims)
{
options.Scope.Add(claim);
}
options.GetClaimsFromUserInfoEndpoint = true;
options.ClaimActions.DeleteClaim("sid");
options.ClaimActions.MapUniqueJsonKey("userLdapid", "userLdapid");
options.ClaimActions.MapUniqueJsonKey("fpUserRole", "fpUserRole");
options.ClaimActions.MapUniqueJsonKey("userType", "userType");
options.Events.OnRedirectToIdentityProvider =
EventsOnRedirectToIdentityProvider(applicationOptions);
options.Events.OnRemoteFailure = EventsOnRemoteFailure();
})
.AddOpenIdConnect("oidc-internal", options =>
{
options.SignInScheme = oidcOptions.CookieSchemeName;
options.Authority = oidcOptions.AuthServerUrl;
options.ClientId = "InternalClientId";
options.ClientSecret = oidcOptions.ClientSecret;
options.ResponseType = oidcOptions.ResponseType;
options.SaveTokens = true;
foreach (var claim in oidcOptions.RequestClaims)
{
options.Scope.Add(claim);
}
options.GetClaimsFromUserInfoEndpoint = true;
options.ClaimActions.DeleteClaim("sid");
options.ClaimActions.MapUniqueJsonKey("userLdapid", "userLdapid");
options.ClaimActions.MapUniqueJsonKey("fpUserRole", "fpUserRole");
options.ClaimActions.MapUniqueJsonKey("userType", "userType");
options.Events.OnRedirectToIdentityProvider =
EventsOnRedirectToIdentityProvider(applicationOptions);
options.Events.OnRemoteFailure = EventsOnRemoteFailure();
});
我可能忽略了一种不同的方法,因为我发现的帖子有点暗示可以这样做,但没有任何东西很适合。
@PabloRecalde : 我不确定是否完全清楚我想要什么。
为了纠正这一点,我们决定借助我们的CICD管道,将同一个代码库拆分成两个独立的实例。我们试图使用同一个实例,并找出一种方法来根据每个请求的主机名在两个OIDC之间切换。 事实证明这很困难。