2011-07-14 9 views
5

Es posible utilizar 2 tipos de autenticaciones: ventanas y nombre de usuario en wcf, utilizando el Modo de seguridad de mensajes y el certificado para autenticar. Mi Nombre de usuario cfg/código es:
servidor CFG:
WCF Autenticación mixta Nombre de usuario y ventanas

<?xml version="1.0"?> 
    <configuration> 
<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="ServiceCredentialsBehavior"> 
       <serviceCredentials> 
        <serviceCertificate findValue="cn=cool" storeName="TrustedPeople" storeLocation="CurrentUser" /> 
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="Util.CustomUserNameValidator, Util" /> 
       </serviceCredentials> 
       <serviceMetadata httpGetEnabled="true" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="ServiceCredentialsBehavior" name="Service"> 
      <endpoint address="" binding="wsHttpBinding" bindingConfiguration="MessageAndUserName" name="SecuredByTransportEndpoint" contract="IService"/> 
     </service> 
    </services> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="MessageAndUserName"> 
       <security mode="Message"> 
        <message clientCredentialType="UserName"/> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client/> 
</system.serviceModel> 
<system.web> 
    <compilation debug="true"/> 
</system.web> 
</configuration> 

cfg Cliente:

<?xml version="1.0" encoding="utf-8"?> 
    <configuration> 
<system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
      <behavior name="LocalCertValidation"> 
       <clientCredentials> 
        <serviceCertificate> 
         <authentication certificateValidationMode="PeerTrust" trustedStoreLocation="CurrentUser" /> 
        </serviceCertificate> 
       </clientCredentials> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="WSHttpBinding_IService" > 
       <security mode="Message"> 
        <message clientCredentialType="UserName" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:48097/WCFServer/Service.svc" 
        binding="wsHttpBinding" 
        bindingConfiguration="WSHttpBinding_IService" 
        contract="ServiceReference1.IService" 
        name="WSHttpBinding_IService" behaviorConfiguration="LocalCertValidation"> 
      <identity> 
       <dns value ="cool" /> 
      </identity> 
     </endpoint> 
    </client> 
</system.serviceModel> 
</configuration> 

qué hay que cambiar, el servidor saber ventanas identidad que acceder a ella?

Respuesta

1

¡Pregunta interesante! Si realmente necesita una combinación de autenticación, podría intentar configurar el transporte como un tipo de autenticación y el mensaje como el otro. No tengo idea si esto funcionaría en la práctica, pero parece razonable dado que puede configurarlos por separado :)

Puede ver si puede establecer algo similar a lo siguiente para que su encuadernación recoja las credenciales de Windows (wsHttpBinding puede manejar credenciales de Windows).

<security mode="Transport"> 
     <transport clientCredentialType="Whatever your authentication method is" /> 
     <message clientCredentialType="Windows" /> 
     </security> 

Si lo intenta, avíseme si funciona.

EDIT:

Oh, according to the documentation es posible realizar la autenticación mixta. Usted tiene que establecer el modo de "mixto", por lo que la configuración puede ser algo como esto:

<security mode="mixed"> 
     <transport clientCredentialType="Whatever your authentication method is" /> 
     <message clientCredentialType="Windows" /> 
     </security> 

De la documentación:

seguridad mixta.La seguridad mixta le ofrece lo mejor de ambos mundos: la seguridad del transporte garantiza la integridad y la confidencialidad de los mensajes, mientras que las credenciales y los reclamos de los usuarios se encapsulan en cada mensaje como en la seguridad de los mensajes. Esto le permite utilizar una variedad de credenciales de usuario que no son posibles con mecanismos de seguridad de transporte estrictos y aprovechar el rendimiento de la seguridad del transporte.

+0

No, no funciona. ¿Tal vez no configuro correctamente las credenciales de Windows y cómo recuperarlas del servidor? – croisharp

+0

¿Realmente necesita 2 métodos de autenticación diferentes? Puede pasar las credenciales de Windows del cliente al servicio y permitir que el servicio [suplante al usuario] (http://www.danrigsby.com/blog/index.php/2008/04/17/impersonate-a-clients- identidad-en-wcf /). Esta podría ser una mejor solución que intentar mezclar y combinar tipos de autenticación. Si desea verificar los nombres de usuario, puede almacenarlos en la base de datos y compararlos con los datos del usuario del cliente suplantado en el objeto devuelto por 'WindowsIdentity.GetCurrent()' (es mejor almacenar el sid, porque se puede cambiar un nombre de usuario).) – Franchesca

+0

Sí, necesito 2 auth. métodos + autorización con NetSqlAzMan, pero sé cómo hacerlo, este es mi problema con la autenticación mixta .. – croisharp

Cuestiones relacionadas