Настройка нескольких экземпляров SAML2 в IdentityServer3 с помощью SustainSys

В IdentityServer3 я настроил несколько экземпляров внешних поставщиков на основе SAML2, используя библиотеку SustainSys в соответствии с документацией.
Я получил это работает, но у меня есть вопрос о SPOptions.EntityID ака Audience Uri, (Это НЕ EntityID, который нам предоставляет внешний провайдер, но вместо этого это EntityID, который мне нужно предоставить внешнему провайдеру)

Если это Audience Uri быть уникальным для каждого экземпляра?

Допустим, я настроил 2 экземпляра провайдеров SAML2 (Okta и Azure AD) в производстве, а затем на основе предоставленного примера кода для конкретной среды Audience Uri НЕ будет уникальным.

Ниже приведен мой код на основе примера кода. (Для краткости я удалил несколько строк)

public class Startup
{        
    public void Configuration(IAppBuilder app)
    {
        app.Map("/identity", idsrvApp =>
        {
            var identityServerOptions = new IdentityServerOptions
            {                    
                AuthenticationOptions = new AuthenticationOptions()
                {         
                    EnableAutoCallbackForFederatedSignout = true,
                    EnableSignOutPrompt = false
                }
                .Configure(ConfigureExternalIdentityProviders)                    
            };
            idsrvApp.UseIdentityServer(identityServerOptions);
        });            
    }

    private void ConfigureExternalIdentityProviders(IAppBuilder app, string signInAsType)
    {           
        // Add okta
        AddSAML2Idp(
            app,                
            signInAsType,
            "https://id.mydomain.com/identity/Saml2", //audienceURI
            "okta", //idpname
            "okta", //caption
            "https://www.okta.com/exk4yxtgy7ZzSDp8e0h7", // externalEntityID
            "https://dev-490944.oktapreview.com/app/exk4yxtgy7ZzSDp8e0h7/sso/saml/metadata"); // metadataLocation

        // Add Azure AD
        AddSAML2Idp(app,                
            signInAsType,
            "https://id.mydomain.com/identity/Saml2", //audienceURI
            "azuread", //idpname
            "Azure ad", //caption
            "https://sts.windows.net/xxxxx-fb1d-40c4-xxxxx-xxxxxxxx/", //externalEntityID
            "https://login.microsoftonline.com/xxxx-fb1d-40c4-40c4-xxxxxxx/federationmetadata/2007-06/federationmetadata.xml?appid=xxxx-xxxx-xxxx-xxxx-xxxxxx"); //metadataLocation
    }      

    private void AddSAML2Idp(IAppBuilder app, string signInAsType,string audienceURI, string idpname, string caption, string externalEntityID, string metadataLocation)
    {
        var authenticationOptions = new Saml2AuthenticationOptions(false)
        {
            SPOptions = new SPOptions
            {
                EntityId = new EntityId(audienceURI),                     
                ModulePath = string.Format("/{0}", idpname)
            },
            SignInAsAuthenticationType = signInAsType,
            AuthenticationType = idpname,
            Caption = caption
        };

        UseIdSrv3LogoutOnFederatedLogout(app, authenticationOptions);

        authenticationOptions.SPOptions.ServiceCertificates.Add(LoadCertificateFromWindwosStore());

        var identityProvider = new IdentityProvider(new EntityId(externalEntityID), authenticationOptions.SPOptions)
        {                
            MetadataLocation = metadataLocation,
            LoadMetadata = true 
        };

        authenticationOptions.IdentityProviders.Add(identityProvider);

        app.UseSaml2Authentication(authenticationOptions);
    }

Таким образом, для okata

Audience Uri: https://id.mydomain.com/identity/Saml2
ACS Uri: https://id.mydomain.com/identity/okta/acs

и для Azure AD

Audience Uri: https://id.mydomain.com/identity/Saml2
ACS Uri: https://id.mydomain.com/identity/azuread/acs

Обратите внимание, что аудитория URI одинакова для обоих случаев.

Должен ли он быть уникальным для каждого экземпляра, например:

https://id.mydomain.com/identity/okta   
https://id.mydomain.com/identity/azuread   

1 ответ

Логически эти два экземпляра являются двумя разными поставщиками услуг SAML2 и должны иметь разные идентификаторы сущностей. Но, поскольку вы не подвергаете их обоих одному и тому же восходящему Idp, это не имеет значения.

Другие вопросы по тегам