Acerca de las tecnologías de aplicación y operación:
Lenguaje de programación: C#
Lado FrontEnd: Windows Presentation Foundation (WPF) - .NET Framework 4.6.1
Lado backend: Windows Communication Foundation (WCF) - .NET Framework 4.6.1
Restaure los paquetes necesarios en el proyecto seleccionado, ejecute el siguiente comando en PM Console
Update-Package -reinstall
En esta aplicación, voy a mostrar cómo utilizar la autorización y la autenticación mediante un servicio WCF en los estándares de Enterprise Architecting.
WCF
Servicio de autenticación ASP.NET
Autenticación personalizada
Cookies HTTP
Autorización PrincipalPermiso Atributo
Tema actual principal
Interceptores de mensajes
Cree una aplicación de servicio WCF.
Agregue un AuthenticationService.svc que reutilice el servicio de autenticación ASP.NET.
Crear clase de validador de usuario.
Habilite la autenticación personalizada en Global.asax.
Devolver cookie si es un usuario válido.
Modificar la configuración del servicio.
Cree un ExecuteOperationsService.svc con tres métodos diferentes denominados SumOperation, ReadOperation y WriteOperation.
Decore los métodos de servicio con el atributo PrincipalPermission solo para acceso autorizado.
Decore la clase ExecuteOperationsService con el atributo AspNetCompatibilityRequirements.
Implementar interceptores en la aplicación del servidor.
Implemente el código de configuración de identidad para los interceptores en la aplicación de servicio.
Modifique el código del lado del servicio para incluir Rol en lugar de Nombre.
Utilice un ticket cifrado para almacenar el nombre de usuario y las funciones.
Cree la Aplicación Cliente y agregue referencias a ambos servicios.
Implementar interceptores en la aplicación cliente.
Cree una instancia del Servicio de autenticación e invoque el método Login().
Recibe la cookie y guárdala.
Cree una instancia de ExecuteOperationsService e invoque SumOperation, ReadOperation y WriteOperation.
Adjunte la cookie al cliente ExecuteOperationsService
1. Agregue un AuthenticationService.svc que reutilice el servicio de autenticación ASP.NET.
Agregue un nuevo servicio WCF y asígnele el nombre AuthenticationService.svc. Elimine los archivos asociados ya que vamos a exponer el Servicio de autenticación ASP.NET.
Eliminar AuthenticationService.cs
Eliminar IAuthenticationService.cs
<%@ ServiceHost Language="C#" Service="System.Web.ApplicationServices.AuthenticationService" Factory="System.Web.ApplicationServices.ApplicationServicesHostFactory" %>
2. Habilite la autenticación personalizada en Global.asax y devuelva una cookie si es un usuario válido.
Agregue un nuevo elemento Web > Clase de aplicación global al proyecto.
protected void Application_Start(remitente del objeto, EventArgs e) { AuthenticationService.Authenticating += AuthenticationService_Authenticating; }
private void AuthenticationService_Authenticating(objeto remitente, AuthenticatingEventArgs e) { string roles = string.Empty; e.Authenticated = UserIsValid(e, roles de referencia); e.AuthenticationIsComplete = verdadero; if (e.Authenticated) { cadena encryptedValue = FormsAuthentication.Encrypt(CreateFormsAuthenticationTicket(e, roles)); OperationContext.Current.OutgoingMessageProperties[HttpResponseMessageProperty.Name] = SetSetCookieInResponseChannelHeaders(encryptedValue); } }
El método extrae el nombre de usuario y la contraseña del objeto Credencial personalizada del argumento del evento de autenticación. Luego valida el Nombre de Usuario y Contraseña con nuestra clase UserValidator.
La propiedad Autenticado representa verdadero/falso si un usuario es válido o no respectivamente.
3. Habilite el servicio de autenticación y la compatibilidad con ASP.NET
Ahora necesitamos modificar el archivo web.config para incluir lo siguiente:
Habilitar el servicio de autenticación
Habilitar la compatibilidad con ASP.NET
<extensiones.web.sistema> <scripting> <servicios web> <authenticationService habilitado="true"/> </serviciosweb> </scripting> </sistema.web.extensiones>
4. Implementar interceptores en la aplicación del servidor.
Esto se debe a que el código anterior de adjuntar una cookie al contexto de operación parece ser un trabajo tedioso cada vez que necesitamos realizar una llamada de servicio. Podemos mover estas tareas a un segundo plano utilizando interceptores WCF.
MSDN: WCF Data Services permite que una aplicación intercepte mensajes de solicitud para que pueda agregar lógica personalizada a una operación. Puede utilizar esta lógica personalizada para validar datos en mensajes entrantes. También puede usarlo para restringir aún más el alcance de una solicitud de consulta, como insertar una política de autorización personalizada por solicitud.
Las siguientes son las actividades involucradas en este paso.
Agregue el comportamiento del interceptor dentro del servidor web.config.
Cree la clase Interceptor Behavior. (Ver en el proyecto)
Cree la clase IdentityMessageInspector . (Ver en el proyecto)
<sistema.modelo de servicio> <servicios> <nombre del servicio="AuthenticationAndAuthorization.ExecuteOperationsService" conductualConfiguration="InterceptorBehavior" /> </servicios> <comportamientos> <comportamientosdeservicio> <comportamiento> <servicioMetadatos httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </comportamiento> <nombre del comportamiento="ComportamientoInterceptor"> <serviceDebug includeExceptionDetailInFaults="true" /> <interceptorBehaviorExtension /> </comportamiento> </servicioComportamientos> </comportamientos> <extensiones> <extensiones de comportamiento> <add name="interceptorBehaviorExtension" type="AuthenticationAndAuthorization.Extensions.IDispatchMessageInspector.InterceptorBehaviorExtension, AuthenticationAndAuthorization, Versión=1.0.0.0, Cultura=neutral"/> </extensionesdecomportamiento> </extensiones> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> </sistema.modelodeservicio>
5. Cifrado de cookies.
Nuestra cookie contiene información que las utilidades de examen HTTP como Fiddler pueden leer fácilmente. Esto hace que la información de las cookies sea propensa a amenazas a la seguridad.
FormsAuthenticationTicket : El espacio de nombres System.Web.Security nos proporciona una clase conveniente. Podemos almacenar el nombre de usuario y la información de roles dentro de esta instancia de clase. La clase de billete también ofrece funciones de caducidad y cifrado.
Private FormsAuthenticationTicket CreateFormsAuthenticationTicket(AuthenticatingEventArgs e, string roles) => new FormsAuthenticationTicket(1, e.UserName, DateTime.Now, DateTime.Now.AddHours(24), true, roles, FormsAuthentication.FormsCookiePath);
cadena encryptedValue = FormsAuthentication.Encrypt(CreateFormsAuthenticationTicket(e, roles)); FormsAuthenticationTicket privado GetDecryptTicket (cadena encryptedTicket) => FormsAuthentication.Decrypt (encryptedTicket);
HttpResponseMessageProperty privado SetSetCookieInResponseChannelHeaders (cadena cookieValue) { respuesta HttpResponseMessageProperty = nuevo HttpResponseMessageProperty(); respuesta.Headers[HttpResponseHeader.SetCookie] = FormsAuthentication.FormsCookieName + "=" + cookieValue; respuesta de devolución; }
<modo de autenticación="Formularios"> <formas slideExpiration="true" name="AuthCookie" proteccion="Todos" tiempo de espera="20"/> </autenticación> <machineKey decryption="AES" validation="SHA1" decryptionKey="1523F567EE75F7FB5AC0AC4D79E1D9F25430E3E2F1BCDD3370BCFC4EFC97A541" validaciónKey="33CBA563F26041EE5B5FE9581076C40618DCC1218F5F447634EDE8624508A129"/>
6. Implementar interceptores en la aplicación cliente.
Las siguientes son las actividades involucradas en este paso.
Agregue el comportamiento del interceptor dentro de Client App.config
Cree la clase Interceptor Behavior. (Ver en el proyecto)
Cree la clase CookieMessageInspector . (Ver en el proyecto)
<comportamientos> <comportamientos de punto final> <nombre de comportamiento ="InterceptorBehavior"> <interceptorBehaviorExtension /> </comportamiento> </endpointBehaviors> </comportamientos>
<endpoint dirección="http://localhost:8046/ExecuteOperationsService.svc" vinculante="basicHttpBinding" vinculanteConfiguration="BasicHttpBinding_IExecuteOperationsService" contrato="ExecuteOperationsServiceReference.IExecuteOperationsService" nombre="BasicHttpBinding_IExecuteOperationsService" ComportamientoConfiguración="InterceptorBehavior"/>