Пользовательский 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 ответ

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