Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
sp:wcf [2009/03/05 11:44] alfred |
sp:wcf [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 323: | Línea 323: | ||
| </system.serviceModel> | </system.serviceModel> | ||
| </code> | </code> | ||
| + | |||
| + | |||
| Línea 333: | Línea 335: | ||
| ==== Autentificación en IIS ==== | ==== Autentificación en IIS ==== | ||
| === Conexión segura en IIS === | === Conexión segura en IIS === | ||
| - | Las conexiones seguras en IIS se basan en SSL y es por ello que tenemos que tenerlo activo en nuestro servidor. Una vez esto sea así, configuraremos la seguridad a partir de la capa de transporte, sin ningún tipo de validación de usuario... Todavía \\ \\ | + | Las conexiones seguras en IIS se basan en SSL y es por ello que tenemos que tenerlo [[code:tools#activar_ssl|activo en nuestro servidor]]. Una vez esto sea así, configuraremos la seguridad a partir de la capa de transporte, sin ningún tipo de validación de usuario... Todavía. \\ \\ |
| Es de remarcar el hecho que en la configuración tengamos que tener ''httpsGetEnabled'' (en vez de ''httpGetEnabled'') a ''true''. | Es de remarcar el hecho que en la configuración tengamos que tener ''httpsGetEnabled'' (en vez de ''httpGetEnabled'') a ''true''. | ||
| <code xml> | <code xml> | ||
| Línea 370: | Línea 372: | ||
| ==== Creación de un cliente sencillo ==== | ==== Creación de un cliente sencillo ==== | ||
| Desde VS .NET 2008 es una tarea muy sencilla, podemos hacerlo desde la línea de comandos del SDK gracias al comando ''svcutil'' o //agregando una referencia a un servicio// (haciendo botón derecho sobre el proyecto de la aplicación). Estas dos operaciones crearían una clase que se utilizaría para acceder al web service como si de una clase normal se tratase, sólo que esta está enlazada con el exterior. | Desde VS .NET 2008 es una tarea muy sencilla, podemos hacerlo desde la línea de comandos del SDK gracias al comando ''svcutil'' o //agregando una referencia a un servicio// (haciendo botón derecho sobre el proyecto de la aplicación). Estas dos operaciones crearían una clase que se utilizaría para acceder al web service como si de una clase normal se tratase, sólo que esta está enlazada con el exterior. | ||
| + | |||
| + | |||
| + | |||
| + | |||
| Línea 375: | Línea 381: | ||
| ==== Creación de un cliente para un escenario seguro ==== | ==== Creación de un cliente para un escenario seguro ==== | ||
| - | === En un escenario cifrado === | + | === Configuración para un canal cifrado === |
| - | Para desarrollar un cliente que acceda a un servicio por un canal cifrado en SSL es necesario que en el archivo de configuración del cliente exista, en el apartado ''binding'' utilizado un apartado de seguridad, en este caso en modo ''Transport''. | + | Para desarrollar un cliente que acceda a un servicio por un canal cifrado en SSL es necesario que en el archivo de configuración del cliente exista, en el apartado ''binding'' utilizado un apartado de seguridad, en este caso en modo ''Transport'' con un ''clientCredentialType'' como ''Basic''. \\ \\ |
| + | En el siguiente ejemplo la aplicación accede por https a un servicio con validación de usuario (de ahí el ''message clientCredentialType="UserName"''): | ||
| <code xml> | <code xml> | ||
| <system.serviceModel> | <system.serviceModel> | ||
| <bindings> | <bindings> | ||
| <basicHttpBinding> | <basicHttpBinding> | ||
| - | <binding name="BasicHttpBinding_PIUServiceVi_Document" closeTimeout="00:01:00" | + | <binding name="BasicHttpBinding_PIUServiceVi_Document" > |
| - | openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" | + | |
| - | allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" | + | |
| - | maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" | + | |
| - | messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" | + | |
| - | useDefaultWebProxy="true"> | + | |
| - | <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" | + | |
| - | maxBytesPerRead="4096" maxNameTableCharCount="16384" /> | + | |
| <security mode="Transport"> | <security mode="Transport"> | ||
| - | <transport clientCredentialType="Basic" proxyCredentialType="None" | + | <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" /> |
| - | realm="" /> | + | |
| <message clientCredentialType="UserName" algorithmSuite="Default" /> | <message clientCredentialType="UserName" algorithmSuite="Default" /> | ||
| </security> | </security> | ||
| Línea 406: | Línea 405: | ||
| === Validación del cliente === | === Validación del cliente === | ||
| + | En el apartado anterior (configuración para un canal cifrado) vemos la porción del archivo de configuración que se requiere para que el cliente acceda a un servicio que haga una petición de validación de usuario. Se agrega en el apartado de seguridad lo siguiente... | ||
| + | <code xml> | ||
| + | <message clientCredentialType="UserName" algorithmSuite="Default" /> | ||
| + | </code> | ||
| + | Pero es necesario indicar qué usuario\password se utilizará, para ello debemos modificar, antes de hacer la conexión con el servicio, la propiedad ''ClientCredentials'' del objeto cliente: | ||
| + | <code csharp> | ||
| + | ServiceReference1.PIUServiceVi_DocumentClient client = new ServiceReference1.PIUServiceVi_DocumentClient(); | ||
| + | client.ClientCredentials.UserName.UserName = "piusbcn"; | ||
| + | client.ClientCredentials.UserName.Password = "atmpiubcn"; | ||
| + | </code> | ||
| + | |||
| === Saltarse el certificado del servicio === | === Saltarse el certificado del servicio === | ||
| + | Cuando desarrollamos con certificados no firmados por una entidad de confianza el motor del cliente no permitirá la conexión por ello debemos escribir el evento de comprovación de certificado: | ||
| + | <code csharp> | ||
| + | using System.Net; | ||
| + | using System.Security.Cryptography.X509Certificates; | ||
| + | ... | ||
| + | ServicePointManager.ServerCertificateValidationCallback += new System.Net.Security.RemoteCertificateValidationCallback(customXertificateValidation); | ||
| + | ... | ||
| + | private static bool customXertificateValidation(object sender, X509Certificate cert, X509Chain chain, System.Net.Security.SslPolicyErrors error) { | ||
| + | return true; | ||
| + | } | ||
| + | </code> | ||
| + | ===== Otros ===== | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==== Activar la compatibilidad con ASP.NET ==== | ||
| + | A veces necesitamos guardar información del usuario en, por ejemplo, sesiones, pero por defecto no lo podemos hacer simplemente accediendo a ''System.Web.HttpContext.Current.Session''. Para poder acceder al contexto web desde un servicio de WCF deberemos hacer dos cosas: | ||
| + | * Activar la compatibilidad desde el archivo de configuración: | ||
| + | <code xml> | ||
| + | <system.serviceModel> | ||
| + | <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> | ||
| + | ... | ||
| + | </code> | ||
| + | * Agregar el atributo ''AspNetCompatibilityRequeriments'' a la clase del servicio (como ''Allowed''): | ||
| + | <code csharp> | ||
| + | [System.ServiceModel.Activation.AspNetCompatibilityRequirements(RequirementsMode = System.ServiceModel.Activation.AspNetCompatibilityRequirementsMode.Allowed)] | ||
| + | public class PiuService : ISAMERWService { | ||
| + | ... | ||
| + | </code> | ||
| + | |||
| + | |||
| ===== Notas ===== | ===== Notas ===== | ||
| Línea 416: | Línea 458: | ||
| ... | ... | ||
| </code> | </code> | ||
| - | + | * Para cambiar el usuario con el que se ejecuta el servicio en IIS deberemos [[sp:wcf#activar_la_compatibilidad_con_asp.net|activar la compatibilidad con asp.net]]. | |
| - | + | * Con la instalación de Visual Studio se nos instala una herramienta denominada //Microsoft Service Configuration Editor//, muy útil para editar de una forma clara los archivos de configuración de un proyecto que involucren servicios. Podemos acceder desde //Inicio -> Programas -> SDK -> Tools//. | |
| ==== IIS ==== | ==== IIS ==== | ||