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/01 18:18] alfred |
sp:wcf [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 34: | Línea 34: | ||
| Controlan la funcionalidad del servicio, por ejemplo el ''ServiceMetadataBehavior'' que controla la publicación de metadatos. Existen comportamientos de seguridad, autorización, construcción del canal... Los comportamientos implementan la ''IServiceBehavior''. | Controlan la funcionalidad del servicio, por ejemplo el ''ServiceMetadataBehavior'' que controla la publicación de metadatos. Existen comportamientos de seguridad, autorización, construcción del canal... Los comportamientos implementan la ''IServiceBehavior''. | ||
| - | ===== A quick look ===== | ||
| - | Para realizar este artículo se han seguido los siguientes artículos: | ||
| - | * [[http://geeks.ms/blogs/jnunez/archive/2007/08/10/tutorial-wcf-1-de-5.aspx]] | ||
| - | * [[http://geeks.ms/blogs/jnunez/archive/2007/08/10/tutorial-wcf-2-de-5.aspx]] | ||
| - | * [[http://geeks.ms/blogs/jnunez/archive/2007/08/10/tutorial-wcf-3-de-5.aspx]] | ||
| - | * [[http://geeks.ms/blogs/jnunez/archive/2007/08/10/tutorial-wcf-4-de-5.aspx]] | ||
| - | * [[http://geeks.ms/blogs/jnunez/archive/2007/08/10/tutorial-wcf-5-de-5.aspx]] | ||
| + | ===== A quick look ===== | ||
| Línea 253: | Línea 247: | ||
| === En la configuración === | === En la configuración === | ||
| En la configuración indicaremos el modo de seguridad en el binding adecuado. En el ejemplo siguiente se define una configuración para un binding ''wsHttpBinding'' llamada ''myWsBinding'' y que es indicada como la que se utilizará en el endpoint del servicio. Define un | En la configuración indicaremos el modo de seguridad en el binding adecuado. En el ejemplo siguiente se define una configuración para un binding ''wsHttpBinding'' llamada ''myWsBinding'' y que es indicada como la que se utilizará en el endpoint del servicio. Define un | ||
| + | |||
| Línea 259: | Línea 254: | ||
| ==== Autentificación personalizada ==== | ==== Autentificación personalizada ==== | ||
| === Clase validadora de usuario === | === Clase validadora de usuario === | ||
| + | :?: \\ \\ | ||
| + | Una clase validadora es la que se encarga de la validación de usuario\contraseña dentro del WebService. Esta ha de heredar de ''UserNamePasswordValidator'' (dentro del ensamblado ''System.IdentityModel.dll''). Cuando la validación falle tendrá que ser lanzada una ''SecurityTokenException''. | ||
| + | <code csharp> | ||
| + | namespace CustomValidator { | ||
| + | public class UserValidator: UserNamePasswordValidator { | ||
| + | public override void Validate(string userName, string password) { | ||
| + | if ((userName != "test") || (password != "test")) { | ||
| + | throw new SecurityTokenException("Validation Failed!"); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </code> | ||
| + | Luego, en la configuración deberemos indicar que la autentificación se hace de forma ''custom'' e indicar también la clase validadora: ''namespace.clase, ensamblado''. | ||
| + | <code xml> | ||
| + | <userNameAuthentication | ||
| + | userNamePasswordValidationMode="Custom" | ||
| + | customUserNamePasswordValidatorType="CustomValidator.UserValidator, SAMERWS"/> | ||
| + | </code> | ||
| === Configuración === | === Configuración === | ||
| - | :!: | + | :?: |
| <code xml> | <code xml> | ||
| <system.serviceModel> | <system.serviceModel> | ||
| Línea 309: | Línea 323: | ||
| </system.serviceModel> | </system.serviceModel> | ||
| </code> | </code> | ||
| + | |||
| + | |||
| Línea 319: | 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 357: | Línea 373: | ||
| 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. | ||
| - | ==== Validación de usuario en el cliente ==== | + | |
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==== Creación de un cliente para un escenario seguro ==== | ||
| + | === 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'' 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> | ||
| + | <system.serviceModel> | ||
| + | <bindings> | ||
| + | <basicHttpBinding> | ||
| + | <binding name="BasicHttpBinding_PIUServiceVi_Document" > | ||
| + | <security mode="Transport"> | ||
| + | <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" /> | ||
| + | <message clientCredentialType="UserName" algorithmSuite="Default" /> | ||
| + | </security> | ||
| + | </binding> | ||
| + | </basicHttpBinding> | ||
| + | </bindings> | ||
| + | <client> | ||
| + | <endpoint address="https://www.atm.cat:8080/piu/previsiones.svc" | ||
| + | binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_PIUServiceVi_Document" | ||
| + | contract="ServiceReference1.PIUServiceVi_Document" name="BasicHttpBinding_PIUServiceVi_Document" /> | ||
| + | </client> | ||
| + | </system.serviceModel> | ||
| + | </code> | ||
| + | |||
| + | === 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 === | ||
| + | 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 367: | 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 ==== | ||