dependabot[bot] on nuget
dependabot[bot] on nuget
InResponseTo
is used as some kind of correlation ID between the authentication request and the returned response?
InResponseTo
when using Sustainsys.Saml2 is the Id of the outbound AuthnRequest, which is a random Id. You cannot control how it is generated.
ID
/InResponseTo
though, so if your Idp depends on that it is worse
AuthProps
. Between that and using the notifications I can probably accomplish what they want. I was just hoping for something a bit cleaner. If I need something more tailored to our needs I'll reach out.
InResponseTo
value available in the ExternalController.Callback
is to implement AcsCommandResultCreated
and add the InResponseTo
as a claim to the identity. That way you don't have to mess with DI-dependent services in the notification.
AcsCommandResultCreated
? Looking at the definitions of CommandResult
and Saml2Response
I don't see a way to get at the identity. I can get the claims useing Saml2Response.GetClaims
but I don't think I can add claims that way.
commandResult.Principal.Claims
builder.AddSaml2(
provider.AuthenticationScheme,
provider.DisplayName,
options =>
{
options.SignInScheme = provider.SignInScheme;
options.SPOptions.EntityId = new EntityId(provider.ServiceProviderEntityId);
options.SPOptions.Logger = adapter;
options.SPOptions.ServiceCertificates.Add(certificate);
options.IdentityProviders.Add(
new IdentityProvider(new EntityId(provider.IdentityProviderEntityId), options.SPOptions)
{
MetadataLocation = provider.MetadataLocation,
LoadMetadata = provider.LoadMetadata,
});
});
KeyNotFoundException: The given key 'Sustainsys.Saml2.Metadata.EntityId' was not present in the dictionary.
AuthenticationProperties
object. Is this the "correct" way to handle a single authentiation scheme with multiple identity providers?
var props = new AuthenticationProperties
{
RedirectUri = Url.Action(nameof(Callback)),
Items =
{
{ "returnUrl", returnUrl },
{ "scheme", scheme },
{ "idp", idp }
}
};
SelectIdentityProvider
and GetIdentityProvider
notifications. Anyone can guide me in the right direction would be appreciated. Thank you.
builder.AddSaml2(
saml2Options =>
{
saml2Options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
saml2Options.SPOptions.EntityId = new EntityId(config.Saml2.ServiceProviderEntityId);
saml2Options.SPOptions.ServiceCertificates.Add(certificate);
saml2Options.Notifications.SelectIdentityProvider =
(id, data) => GetProvider(identityProviderStore, id, data, saml2Options, logger);
saml2Options.Notifications.GetIdentityProvider =
(id, data, options) => GetProvider(identityProviderStore, id, data, options, logger);
saml2Options.Notifications.AcsCommandResultCreated =
(commandResult, response) =>
{
if (commandResult.Principal.Identity is ClaimsIdentity identity)
identity.AddClaim(new Claim("in_response_to", response.InResponseTo.Value));
};
});
GetProvider
method looks something like this...
private IdentityProvider GetProvider(IEegIdentityProviderStore identityProviderStore, EntityId id, IDictionary<string,string> data, IOptions options, ILogger logger)
{
Saml2IdentityProvider provider = identityProviderStore.GetSamlProviderByEntityId(id.Id);
if (provider == null)
return null;
idp =
new IdentityProvider(new EntityId(provider.EntityId), options.SPOptions)
{
MetadataLocation = provider.Debug
? provider.DebugMetadataLocation
: provider.MetadataLocation
};
logger.Verbose("Adding Identity Provider: {IdpName}", provider.DisplayName);
if (provider.Debug)
logger.Warning(
"Provider {Provider} is in debug mode, using metadata URL: {MetadataUrl}",
provider.DisplayName,
provider.DebugMetadataLocation);
options.IdentityProviders.Add(idp);
return idp;
}
options.IdentityProviders
collection multiple times. That would also be a problem.