我有两个可以定向到我的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以'internal'开头,则将配置用于'internal'。我刚开始配置Web应用程序以使用身份验证提供程序,所以我不太了解这种可能性。
研究此问题时出现的一件事是像这样向AddOpenIdConnect
添加第二个OIDC块,然后在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();
});
我可能忽略了一种不同的方法,因为我发现帖子暗示了可以做到的事情,但没有什么合适的选择。
答案 0 :(得分:0)
@PabloRecalde:我不确定是否完全清楚我想要的东西。
为解决这个问题,我们决定借助CI / CD管道将同一代码库分成两个单独的实例。我们试图使用相同的实例,并找到一种基于每个请求的主机名在两个OIDC之间切换的方法。事实证明这很困难。