Пользовательский ServiceHostFactory с использованием WCF и.net 4.5
Попытка создать пользовательский ServiceHostFactory и увидеть следующую ошибку, зарегистрированную в окне просмотра событий.
WebHost не удалось обработать запрос. Информация об отправителе: System.ServiceModel.ServiceHostingEnvironment+HostingManager/38902774 Исключение: System.ServiceModel.ServiceActivationException: служба '/services/clientservices.svc' не может быть активирована из-за исключения во время компиляции. Сообщение об исключении: Менеджер токенов безопасности не может создать аутентификатор токена для требования 'System.ServiceModel.Security.Tokens.RecipientServiceModelSecurityTokenRequirement: PropertyName: http://schemas.microsoft.com/ws/2006/05/identitymodel/securitytokenrequirement/KeyType PropertyValue: SymmetricKey
PropertyName: http://schemas.microsoft.com/ws/2006/05/identitymodel/securitytokenrequirement/KeyUsage PropertyValue: Подпись
PropertyName: http://schemas.microsoft.com/ws/2006/05/identitymodel/securitytokenrequirement/RequireCryptographicToken PropertyValue: True
PropertyName: http://schemas.microsoft.com/ws/2006/05/identitymodel/securitytokenrequirement/KeySize PropertyValue: 0
PropertyName: http://schemas.microsoft.com/ws/2006/05/identitymodel/securitytokenrequirement/IsOptionalTokenProperty PropertyValue: False PropertyName: http://schemas.microsoft.com/ws/2006/05/servicemodel/securitytokenrequirement/SupportSecurityContextCancellation: Ложь
PropertyName: http://schemas.microsoft.com/ws/2006/05/servicemodel/securitytokenrequirement/IsInitiator PropertyValue: False
PropertyName: http://schemas.microsoft.com/ws/2006/05/servicemodel/securitytokenrequirement/SecurityBindingElement PropertyValue: System.ServiceModel.Channels.SymmetricSecurityBindingElement: DefaultAlgorithmSuite: IncludeTimestamp Basic-256: Правда KeyEntropyMode: CombinedEntropy MessageSecurityVersion: WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11 SecurityHeaderLayout: Строгие ProtectTokens: False EndpointSupportingTokenParameters: Endorsing[0] System.ServiceModel.Security.Tokens.IssuedSecurityTokenParameters: InclusionMode: AlwaysToRecipient ReferenceStyle: Internal RequireDerivedKeys: правда .net / v2 / wstrust / 13 / Certificate IssuerMetadataAddress: null DefaultMessgeSecurityVersion: null UseStrTransform: False IssuerBinding: null ClaimTypeRequirements: нет Нет подписанных токенов. Нет подписанных зашифрованных токенов. Нет подписанных подтверждающих токенов. OptionalEndpointSupportingTokenParameters: нет подтверждающих токенов. Нет подписанных токенов. Нет подписанных зашифрованных токенов. Нет подписанных подтверждающих токенов. OperationSupportingTokenParameters: нет OptionalOperationSupportingTokenParameters: нет MessageProtectionOrder: SignBeforeEncryptAndEncryptSignature RequireSignatureConfirmation: Истинная защита TokenParameters: System.ServiceModel.SecuritySignSignSignSignSignSignSignSignSignSignSignSignSignSignSignSignSense::: 0: 0: 0DWD_SecuritySignSignSignSignSignSignSignSignSignS!TeRenceSecuritySecuritySecurity:SecuritySignSignSecuritySecurity:::.Security.Security:Security::, ReceptionSecurity,, Regency, Regency, Regency, ReD, RegencySecuritySecurity::, Reception, ReSec, SecurityD, ReaderSignSignSignSign::, ReaderSignSignSignS, Reader.Security.Security:.Security.,.Security:.Security:.Rec.
....
Вот код, который я использую создать сервисный хостинг
public class WSTrustServiceHostFactory : ServiceHostFactory { public static Binding CreateIssuedTokenForCertificateBinding(string acsCertificateEndpoint) { //http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0 BindingElementCollection bec = new BindingElementCollection(); bec.Add(SecurityBindingElement. CreateIssuedTokenForCertificateBindingElement( new IssuedSecurityTokenParameters("samlTokenType", new EndpointAddress(acsCertificateEndpoint)))); bec.Add(new TextMessageEncodingBindingElement()); bec.Add(new HttpTransportBindingElement()); return new CustomBinding(bec); } protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) { if (serviceType == null) throw new ArgumentNullException("serviceType cannot be null"); if (baseAddresses.Count() == 0) throw new ArgumentException("baseAddresses must have at least 1 member."); string acsCertificateEndpoint = "https://acs url ...." WSFederationHttpSecurityMode securityMode = WSFederationHttpSecurityMode.TransportWithMessageCredential; if ( debugging ) { securityMode = WSFederationHttpSecurityMode.Message; } ServiceHost serviceHost = new ServiceHost(serviceType, baseAddresses); //IssuedTokenWSTrustBinding issuedTokenWSTrustBinding = new IssuedTokenWSTrustBinding( // new CertificateWSTrustBinding(securityMode), // new EndpointAddress(acsCertificateEndpoint)); System.IdentityModel.Configuration.IdentityConfiguration serviceConfiguration = new System.IdentityModel.Configuration.IdentityConfiguration(); serviceHost.Credentials.ServiceCertificate.Certificate = // fetch acs decryption certificate; acsSigningCertificate = //fetch acs signing certificate. ConfigurationBasedIssuerNameRegistry issuerNameRegistry = new ConfigurationBasedIssuerNameRegistry(); issuerNameRegistry.AddTrustedIssuer(acsSigningCertificate.Thumbprint, acsSigningCertificate.SubjectName.Name); serviceConfiguration.IssuerNameRegistry = issuerNameRegistry; serviceConfiguration.AudienceRestriction.AudienceMode = System.IdentityModel.Selectors.AudienceUriMode.Always; serviceConfiguration.CertificateValidationMode = X509CertificateValidationMode.None; serviceConfiguration.SecurityTokenHandlers.AddOrReplace(new Saml2SecurityTokenHandler()); // wif 3.5 //serviceHost.AddServiceEndpoint(serviceType.GetInterfaces()[0], issuedTokenWSTrustBinding, String.Empty); serviceHost.AddServiceEndpoint(serviceType.GetInterfaces()[0], CreateIssuedTokenForCertificateBinding(acsCertificateEndpoint), String.Empty); //var creds = serviceHost.Description.Behaviors.Find<ServiceCredentials>(); // creds.UseIdentityConfiguration = true; //creds.IdentityConfiguration = serviceConfiguration; serviceHost.Credentials.UseIdentityConfiguration = true; serviceHost.Credentials.IdentityConfiguration = serviceConfiguration; // <--wif 3.5 FederatedServiceCredentials.ConfigureServiceHost(serviceHost, serviceConfiguration); --> if (RegionConfiguration.GetSetting<bool>(Settings.CLIENTSERVICES_INCLUDE_EXCEPTION_DETAILS)) { if (serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>() == null) { serviceHost.Description.Behaviors.Add(new ServiceDebugBehavior()); } serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>().IncludeExceptionDetailInFaults = true; } return serviceHost; } }
Есть идеи, что здесь происходит?
1 ответ
Может быть, посмотрите здесь как "шаблон" https://github.com/thinktecture/Thinktecture.IdentityServer.v2/blob/master/src/Libraries/Thinktecture.IdentityServer.Protocols/WSTrust/TokenServiceHostFactory.cs