Настройка нескольких экземпляров 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, это не имеет значения.