Загрузка динамических c SAML схем для IdentityServer4 с использованием ComponentSpace - PullRequest
0 голосов
/ 08 января 2020

Мы централизовали IdentityServer4, который будет выступать в качестве поставщика услуг, и есть несколько поставщиков удостоверений, таких как Active Directory, Google, Facebook, а также другие поставщики SAML на основе каждого арендатора. т. е. один поставщик услуг и несколько поставщиков удостоверений.

Чтобы загрузить конфиги openId из базы данных, я точно следую { ссылка }, и он работает, как и ожидалось, для openid, и теперь мне нужно Интегрируйте провайдеров SAML таким же образом.

Я прошел «SAMLv20.Core -valuation» из componentspace и смог успешно выполнить интеграцию с помощью настроек приложений. json.

Но я не уверен, как интегрировать его программно, как указано в { ссылка }.

Вот что я сделал до сих пор

public class AccountController : ControllerBase
{
    private readonly IOptionsMonitorCache<OpenIdConnectOptions> _openIdOptionsCache;
    private readonly IOptionsMonitorCache<SamlAuthenticationOptions> _samlOptionsCache;
    private readonly OpenIdConnectPostConfigureOptions _postConfigureOptions;
    private readonly SamlPostConfigureAuthenticationOptions _samlPostConfigureOptions;

    public AccountController(
        IOptionsMonitorCache<OpenIdConnectOptions> openidOptionsCache,
        IOptionsMonitorCache<SamlAuthenticationOptions> samlOptionsCache,
        OpenIdConnectPostConfigureOptions postConfigureOptions,
        SamlPostConfigureAuthenticationOptions samlPostConfigureOptions
        )
    {
        _openIdOptionsCache = openidOptionsCache;
        _samlOptionsCache = samlOptionsCache;
        _postConfigureOptions = postConfigureOptions;
        _samlPostConfigureOptions = samlPostConfigureOptions;
    }



    private async Task<IEnumerable<AuthenticationScheme>> LoadAuthenticationSchemesByTenant(IEnumerable<AuthenticationScheme> schemes, AuthProviderSetting tenantAuthProviderSetting)
    {
            dynamic configJson = JsonConvert.DeserializeObject(tenantAuthProviderSetting.tenantConfigJson);
            switch (tenantAuthProviderSetting.AuthenticationType)
            {
                case AuthenticationTypes.OpenID:
                    var oidcOptions = new OpenIdConnectOptions
                    {
                        SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme,
                        SignOutScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme,
                        SaveTokens = true,
                        Authority = configJson.Authority, 
                        ClientId = configJson.ClientId, 
                        ClientSecret = configJson.ClientSecret, 

                        TokenValidationParameters = new TokenValidationParameters
                        {
                            NameClaimType = "name",
                            RoleClaimType = "role",
                            ValidateIssuer = false
                        }
                    };
                    _schemeProvider.AddScheme(new AuthenticationScheme(tenantAuthProviderSetting.AuthenticationScheme, tenantAuthProviderSetting.DisplayName, typeof(OpenIdConnectHandler)));
                    _postConfigureOptions.PostConfigure(tenantAuthProviderSetting.AuthenticationScheme, oidcOptions);
                    _openIdOptionsCache.TryAdd(tenantAuthProviderSetting.AuthenticationScheme, oidcOptions);
                    schemes = await _schemeProvider.GetAllSchemesAsync();
                    break;

                case AuthenticationTypes.SAML:
                    var samlOptions = new SamlAuthenticationOptions
                    {

                        PartnerName = delegate () { return "https://ExampleIdentityProvider"; },
                        SingleLogoutServicePath = "https://localhost:44313/SAML/SingleLogoutService",

                        // Not sure how to set other parameters here

                    };

                    _schemeProvider.AddScheme(new AuthenticationScheme(tenantAuthProviderSetting.AuthenticationScheme, tenantAuthProviderSetting.DisplayName, typeof(SamlAuthenticationHandler)));
                    _samlPostConfigureOptions.PostConfigure(tenantAuthProviderSetting.AuthenticationScheme, samlOptions);
                    _samlOptionsCache.TryAdd(tenantAuthProviderSetting.AuthenticationScheme, samlOptions);
                    schemes = await _schemeProvider.GetAllSchemesAsync();
                    break;
                default:
                    schemes = await _schemeProvider.GetAllSchemesAsync();
                    break;

            }
        return schemes;
    }
}

Вот конфиг, через который я статически интегрировался с IdentityServer

"SAML": {
  "$schema": "https://www.componentspace.com/schemas/saml-config-schema-v1.0.json",
  "Configurations": [
    {
      "LocalServiceProviderConfiguration": {
        "Name": "https://IdentityServer4",
        "Description": "IdentityServer4",
        "AssertionConsumerServiceUrl": "http://localhost:44380/SAML/AssertionConsumerService",
        "SingleLogoutServiceUrl": "http://localhost:44380/SAML/SingleLogoutService",
        "LocalCertificates": [
          {
            "FileName": "certificates/sp.pfx",
            "Password": "password"
          }
        ]
      },
      "PartnerIdentityProviderConfigurations": [
        {
          "Name": "https://ExampleIdentityProvider",
          "Description": "Example Identity Provider",
          "SignAuthnRequest": true,
          "SingleSignOnServiceUrl": "https://localhost:44313/SAML/SingleSignOnService",
          "SingleLogoutServiceUrl": "https://localhost:44313/SAML/SingleLogoutService",
          "PartnerCertificates": [
            {
              "FileName": "certificates/idp.cer"
            }
          ]
        }
      ]
    }
  ]
},
"PartnerName": "https://ExampleIdentityProvider"

1 Ответ

0 голосов
/ 09 января 2020

Просто чтобы подтвердить, что вы хотите добавить конфигурацию SAML динамически?

Лучший способ сделать это - реализовать ISamlConfigurationResolver, как описано в разделе «Реализация ISamlConfigurationResolver» нашего Руководства по настройке.

https://www.componentspace.com/Forums/8234/Configuration-Guide

Ваша реализация ISamlConfigurationResolver вызывается всякий раз, когда требуется конфигурация. Это означает, что конфигурация SAML полностью динамическая c.

...