2008-11-13 6 views
7

Estoy utilizando un servicio WCF y un punto final net.tcp con el modo de permiso principal de serviceAuthentication establecido en UseWindowsGroups.Uso de la autenticación de rol de Windows en App.config con WCF

Actualmente en la implementación del servicio, estoy usando el atributo PrincipalPermission para establecer los requisitos de roles para cada método.

 [PrincipalPermission(SecurityAction.Demand, Role = "Administrators")] 
     [OperationBehavior(Impersonation = ImpersonationOption.Required)] 
     public string method1() 

que estoy tratando de hacer casi exactamente lo mismo, excepto tener la configuración para el papel establecido en el app.config. ¿Hay alguna manera de hacer esto y seguir utilizando la autenticación de grupos de Windows?

Gracias

Respuesta

3

Si he entendido bien que desea seleccionar el papel en tiempo de ejecución. Esto se puede hacer con una demanda permission dentro de la operación WCF. P.ej.

public string method1() 
{ 
    PrincipalPermission p = new PrincipalPermission(null, "Administrators"); 
    p.Demand(); 
    ... 
8

Si usted es anfitrión de su servicio WCF en IIS, se ejecutará en el proceso de trabajo de ASP.NET, lo que significa que puede configurar la autenticación y autorización como lo haría con los servicios web ASMX:

<system.Web> 
    <authentication mode="Windows"/> 
    <authorization> 
     <allow roles=".\Administrators"/> 
     <deny users="*"/> 
    </authorization> 
</system.Web> 

Luego tendrá que deshabilitar el acceso anónimo a su punto final en IIS, y en su lugar habilitar Autenticación integrada de Windows.
En la consola de administración de IIS, haga eso mostrando el cuadro de diálogo 'Propiedades' para su directorio virtual. A continuación, encontrará la configuración de seguridad en la pestaña 'Seguridad de directorios'.

Por supuesto, el único canal de comunicación disponible será HTTP. Los clientes tendrán que proporcionar su identidad de Windows en la solicitud en el transporte a nivel con estos ajustes:

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="WindowsSecurity"> 
       <security mode="Transport"> 
        <transport clientCredentialType="Windows" /> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="https://localhost/myservice" 
        binding="wsHttpBinding" 
        bindingConfiguration="WindowsSecurity" 
        contract="IMyService" /> 
    </client> 
</system.serviceModel> 

Tenga en cuenta que si su extremo de servicio utiliza wsHttpBinding entonces usted también tendrá que agregar SSL a su punto final ya que ese es un requisito exigido por WCF cuando usa seguridad de nivel de transporte.
Si en vez de ir para el basicHttpBinding, que luego son capaces de utilizar un modo menos seguro autenticación disponible en WCF llamada TransportCredentialOnly, donde ya no se requiere SSL.

Para obtener información más detallada, here es una buena visión general de la infraestructura de seguridad en WCF.

+3

Tenga en cuenta que si desea hacer esto, necesita activar el modo de compatibilidad ASP.NET en su archivo web.config. De lo contrario, simplemente no funcionará (y tampoco arrojará un error). – Rocklan

+0

Nota: para que esto funcione, system.web/roleManager/@enabled debe ser falso u omitirse; de ​​lo contrario, los roles serán IIS .Net Roles y no grupos de Windows. – Polyfun

Cuestiones relacionadas