一个OpenIdConnect服务的多种配置

问题描述 投票:0回答:1

我有两个可以指向我的Web应用程序的URL。根据URL,我想更改要使用的OpenIdConect(OIDC)配置。 我希望能够在不重新启动应用程序的情况下完成这项工作。这个需求是在创建了web应用之后提出的,现在需要支持两个URL。

比方说,这两个URL是

  • 内部 -mywebapp.company.com
  • 我的应用公司.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以 "内部 "开头,则使用 "内部 "的配置。 我对配置一个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();
});

我可能忽略了一种不同的方法,因为我发现的帖子有点暗示可以这样做,但没有任何东西很适合。

asp.net-core configuration identityserver4 startup
1个回答
0
投票

@PabloRecalde : 我不确定是否完全清楚我想要什么。

为了纠正这一点,我们决定借助我们的CICD管道,将同一个代码库拆分成两个独立的实例。我们试图使用同一个实例,并找出一种方法来根据每个请求的主机名在两个OIDC之间切换。 事实证明这很困难。

© www.soinside.com 2019 - 2024. All rights reserved.