一个OpenIdConnect服务的多种配置

时间:2020-05-24 15:55:39

标签: asp.net-core configuration identityserver4 startup

我有两个可以定向到我的Web应用程序的URL。根据URL,我想更改要使用的OpenIdConect(OIDC)配置。我希望能够在不重新启动应用程序的情况下执行此操作。该要求是在创建Web应用程序之后提出的,现在需要支持两个URL。

让我们说这些URL是:

  • internal-mywebapp.company.com
  • mywebapp.company.com

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();
});

我可能忽略了一种不同的方法,因为我发现帖子暗示了可以做到的事情,但没有什么合适的选择。

1 个答案:

答案 0 :(得分:0)

@PabloRecalde:我不确定是否完全清楚我想要的东西。

为解决这个问题,我们决定借助CI / CD管道将同一代码库分成两个单独的实例。我们试图使用相同的实例,并找到一种基于每个请求的主机名在两个OIDC之间切换的方法。事实证明这很困难。

相关问题