public void GetDelegateForIdpDescriptors_entities_descriptor_metadata_Test() { //ARRANGE var metadata = EntityDescriptorProviderMock.GetEntitiesDescriptor(); var handler = new MetadataEntitiesDescriptorHandler(); //ACT var del = IdpMetadataHandlerFactory.GetDelegateForIdpDescriptors(typeof(EntitiesDescriptor), typeof(IdentityProviderSingleSignOnDescriptor)); var idps = del(handler, metadata) .ToList(); //ASSERT Assert.AreEqual(1, idps.Count); }
public static void OnReceived(MetadataBase metadata, IDependencyResolver dependencyResolver) { if (metadata == null) { throw new ArgumentNullException("metadata"); } if (dependencyResolver == null) { throw new ArgumentNullException("dependencyResolver"); } string entityId = "RegisteredIssuer"; var handlerType = typeof(IMetadataHandler <>).MakeGenericType(metadata.GetType()); var handler = dependencyResolver.Resolve(handlerType); var del = IdpMetadataHandlerFactory.GetDelegateForIdpDescriptors(metadata.GetType(), typeof(IdentityProviderSingleSignOnDescriptor)); var idps = del(handler, metadata).Cast <IdentityProviderSingleSignOnDescriptor>(); var identityRegister = SecurityTokenHandlerConfiguration.DefaultIssuerNameRegistry as ConfigurationBasedIssuerNameRegistry; if (identityRegister == null) { return; } var register = idps.SelectMany(x => x.Keys.SelectMany(y => y.KeyInfo.Select(cl => { var binaryClause = cl as BinaryKeyIdentifierClause; if (binaryClause == null) { throw new InvalidOperationException(String.Format("Expected type: {0} but it was: {1}", typeof(BinaryKeyIdentifierClause), cl.GetType())); } var certContent = binaryClause.GetBuffer(); var cert = new X509Certificate2(certContent); return(cert); }))).Aggregate(identityRegister, (t, next) => { if (!identityRegister.ConfiguredTrustedIssuers.Keys.Contains(next.Thumbprint)) { identityRegister.AddTrustedIssuer(next.Thumbprint, entityId); } return(t); }); }
protected override async Task ApplyResponseChallengeAsync() { if (this.Response.StatusCode != 401) { return; } var challenge = this.Helper.LookupChallenge(this.Options.AuthenticationType, this.Options.AuthenticationMode); if (challenge == null) { return; } if (!this.Options.SSOPath.HasValue || base.Request.Path != this.Options.SSOPath) { return; } var federationPartyId = FederationPartyIdentifierHelper.GetFederationPartyIdFromRequestOrDefault(Request.Context); if (this._configuration == null) { var configurationManager = this._resolver.Resolve <IConfigurationManager <MetadataBase> >(); this._configuration = await configurationManager.GetConfigurationAsync(federationPartyId, new System.Threading.CancellationToken()); } Uri signInUrl = null; var metadataType = this._configuration.GetType(); var handlerType = typeof(IMetadataHandler <>).MakeGenericType(metadataType); var handler = this._resolver.Resolve(handlerType); //ToDo: sort this one in phase3 when implementing owin middleware. //no need to have two methods in the handler. use GetDelegateForIdpDescriptors var locationDel = IdpMetadataHandlerFactory.GetDelegateForIdpLocation(metadataType); signInUrl = locationDel(handler, this._configuration, new Uri(Bindings.Http_Redirect)); //the lines below are likely to do all what we need. var idpDel = IdpMetadataHandlerFactory.GetDelegateForIdpDescriptors(this._configuration.GetType(), typeof(IdentityProviderSingleSignOnDescriptor)); var idp = idpDel(handler, this._configuration).Cast <IdentityProviderSingleSignOnDescriptor>().First(); var federationPartyContextBuilder = this._resolver.Resolve <IFederationPartyContextBuilder>(); var federationContext = federationPartyContextBuilder.BuildContext(federationPartyId); var requestContext = new AuthnRequestContext(signInUrl, federationContext, idp.NameIdentifierFormats); var protocolContext = new SamlProtocolContext { RequestContext = new HttpRedirectRequestContext { BindingContext = new HttpRedirectContext(requestContext), RequestHanlerAction = redirectUri => { this.Response.Redirect(redirectUri.AbsoluteUri); return(Task.CompletedTask); } } }; var protocolFactory = this._resolver.Resolve <Func <string, IProtocolHandler> >(); var protocolHanlder = protocolFactory(Bindings.Http_Redirect); await protocolHanlder.HandleRequest(protocolContext); }