domingo, 25 de julio de 2010

Conceptos Básicos de seguridad en .NET (parte II)

Autorización

La autorización ocurre inmediatamente después de la autenticación y es como el sistema determina que recursos pueden utilizarse de acuerdo con la autenticación, regresando a la analogía del edificio la autorización ocurre después que nos identificamos (autenticación) ante el guardia y le decimos a que piso vamos, entonces nos da un gafete con el número de piso y que nos autoriza movernos únicamente en ese piso mientras nos encontremos dentro el edificio.

La interfaz IPrincipal

El modelo de seguridad basado en roles (roled-based security o RBS) permite controlar el acceso de los usuarios a los recursos en base a su identidad y su pertenencia a un grupo o membership, este modelo esta diseñado para ser independiente de la plataforma donde se implemente por lo que .NET utiliza el concepto de principal (representado por la interfaz IPrincipal) como una forma de abstraer este modelo y encapsular la información acerca del contexto de seguridad (security context) de la entidad (usuario o objeto) que ejecuta el código.


Hay diferentes tipos de objetos Principal cada uno para cada tipo de identidad y de membership, .NET proporciona los siguientes tipos de principales.

  • Windows Principal: Si utilizamos la seguridad Integrada de Windows este objeto representa la identidad, la autenticación y los roles de Windows.

  • Generic Principal: Representa una seguridad a nivel aplicación, independiente de la seguridad de Windows, los roles y los usuarios utilizan un método personalizado de autenticación como por ejemplo una tabla en una base de datos.

Hay dos técnicas para crear objetos Principal dependiendo de si una aplicación requiere hacer la validación algunas veces o durante toda su ejecución. Vamos a mostrar estas formas utilizando como ejemplo el objeto WindowsPrincipal.


La primera técnica se recomienda si requerimos hacer la validación de cierto código algunas veces durante la ejecución, la sintaxis es:


WindowsIdentity wi = WindowsIdentity.GetCurrent();
WindowsPrincipal wp = new WindowsPrincipal(wi);

En esas lineas, primero obtenemos una instancia de WindowsIdentity al consultar la cuenta de Windows que ejecuta el código con el método GetCurrent y después la usamos como parámetro para construir un objeto WindowsPrincipal.


La segunda técnica se utiliza si requerimos hacer la validación durante toda la ejecución de la aplicación entonces en este caso debemos establecer la seguridad de Windows a nuestro hilo principal de ejecución ya que .NET de forma predeterminada no estable esa propiedad, entonces la sintaxis es la siguiente:


AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
WindowsPrincipal wp = (WindowsPrincipal)Thread.CurrentPrincipal;

En esas líneas primeramente establecemos la política de autorización al dominio de la aplicación con el valor de la enumeración PrincipalPolicy , después obtenemos el Principal del hilo de ejecución y hacemos un casting a un objeto WindowsPrincipal, si no establecemos la política no podremos hacer el casting de Thread.CurrentPrincipal a WindowsPrincipal ya que como mencionamos anteriormente .NET no establece esta propiedad.


Una vez teniendo el objeto WindowsPrincipal además de las propiedades y métodos de la clase WindowsIdentity podemos determinar su pertenencia a un grupo o rol, con el método IsInRole.
El método IsInRole de WindowsPrincipal tiene tres sobrecargas la primera recibe como argumento una cadena conteniendo el nombre del grupo o rol que debe escribirse para grupos basados en dominios de la siguiente forma:

[NombreDelDominio]\[Grupo]


O de la siguiente forma si es para grupos de la computadora local.

[NombreDeLaMaquina]\[Grupo]


La segunda sobrecarga recibe un RID (Role Identifier) y la tercera recibe una enumeración WindowsBuiltInRole
La tabla siguiente lista los identificadores del rol con su correspondiente valor en la enumeración WindowsBuiltInRole


+----------------+------+
|AccountOperator |0x224 |
|Administrator |0x220 |
|BackupOperator |0x227 |
|Guest |0x222 |
|PowerUser |0x223 |
|PrintOperator |0x226 |
|Replicator |0x228 |
|SystemOperator |0x225 |
|User |0x221 |
+----------------+------+

El siguiente programa demuestra el uso de la primera técnica de validación para conocer la autorización de una entidad.


Al compilar y ejecutar el programa con una cuenta de administrador mostrará el siguiente resultado:


Ahora bien, si ejecutamos el programa con el comando
runas /user:[Usuario] [Programa]

en este caso con la cuenta del usuario postgres,como se muestra en la imagen:


El programa mostrará el siguiente resultado:


Y ahora demostramos la segunda técnica utilizando la política del dominio de la aplicación, algo más elaborado que el ejemplo anterior, lo ejemplificamos con el código de clase Roles.cs y la clase SimplePrincipalThread.cs que listamos a continuación.

El listado Roles.cs


El listado SimplePrincipalThread.cs


Al compilar las clases y ejecutar el programa con la opción false nos mostrará la excepción de que no hemos establecido una política de autorización.


Si ejecutamos el programa sin argumentos nos mostrará las instrucciones de uso.


Si ejecutamos el programa correctamente,nos mostrará la información como en la siguiente imagen


 Descarga el código fuente

lunes, 19 de julio de 2010

Libros de programación en C# para descargar

Buscando bibliografía en Internet de C#, aquí pongo enlaces para descargar libros electrónicos de programación en C#.
Esperando sean de utilidad.

  1. Visual C# ASP.NET Programming
  2. Windows form programming with C#
  3. Programming Microsoft Windows with C#
  4. Teach yourself the C# language in 21 Days
  5. Programming C#
  6. C# for Java Programmers
  7. Asp .NET Web Developers guide
  8. Beginning AJAX with ASP.NET
  9. C# .NET Web Developers guide
  10. Network programming in .NET
  11. Microsoft C# Professional Projects
  12. C#:Your visual blueprint for building .NET applications
  13. Applied Microsoft .NET Framework Programming
  14. C# Developer's Headstart
  15. ASP.NET Your visual blueprint
  16. MCAD/MCSD Designing and implementing Web Applications
  17. C# Programming for the absolute beginner
  18. Professional Crystal Reports for VS.NET
  19. Professional C# 3rd Edition
  20. Advanced C# Programming
  21. C# Bible
  22. C# for Java Developers
  23. MCAD/MCSD.NET Developing and implementing Windows-Based Applications with Visual C#
  24. OOP with Microsoft Visual Basic .NET
  25. TCP/IP Sockets in C#, Practical Guide
  26. Threading in C#
  27. An introduction to programming with C# Threads
  28. C# COM+ Programming
  29. ASP .NET Database programming
  30. Thinking in C#
  31. Beginning ASP.NET 2.0 in C#
  32. Pro ASP.NET 2.0 in C#
  33. Beginning ASP.NET 2.0 with C#
  34. CLR via C#, Second Edition
  35. Beginning ASP.NET 2.0 Databases, From Novice to Professional
  36. Build your own ASP.NET 2.0 Web Site
  37. ASP.NET 2.0 For Dummies
  38. ASP .NET 2.0 Server Control and Component Development
  39. Pro C# 2005 and the .NET 2.0 Platform
  40. ASP .NET Ajax in Action
  41. Designing and developing Web-based application using .NET
  42. Expert Service-Oriented Architecture in C# 2005
  43. Pro ASP.NET 2.0 Website Programming
  44. Pro Scalable .NET 2.0 Application Designs
  45. Foundations of Object-Oriented Programming Using .NET 2.0 Patterns
  46. ASP.NET 2.0 Everyday Apps for Dummies
  47. C# 2005 for Dummies
  48. C# 2.0 Practical Guide for Programmers
  49. Introducing Microsoft ASP.NET AJAX
  50. Beginning C# game programming

miércoles, 14 de julio de 2010

Conceptos Básicos de seguridad en .NET (parte I)

La seguridad es un tema que debe estar presente desde el comienzo del diseño de todo sistema de información, más aún si este sistema será utilizado por usuarios desde Internet.
Dos conceptos básicos para entender la seguridad de los sistemas es la autenticación y la autorización.

Autenticación

La autenticación es el proceso mediante el cual el sistema identifica y válida que el usuario pruebe quién dice ser, es similar a cuando hacemos una visita a un edificio y un guardia de seguridad en la entrada nos solicita una credencial para que nos identifiquemos, el mecanismo de credenciales más usadas en los sistemas de información es el login y el password.
Entonces en definición la autenticación es el mecanismo que se refiere a probar y validar quiénes somos dentro del sistema, esta identidad consiste generalmente del login de usuario y del rol asociado con ese login, NET proporciona los siguientes mecanismos de autenticación:


Windows Authentication Utiliza la seguridad del sistema operativo windows y compara las credenciales (login y password) con las credenciales de Windows una vez identificado, windows utiliza un número de 96 bits llamado SID (security identifier) para identificarlo.


Passport Authentication En este tipo los usuarios utilizan sus cuentas de Hotmail o de Windows Messenger para autenticarse y por ende su servicio de registro en caso de no tener una cuenta passport, para utilizar esta autenticación es necesario descargar e instalar Passport SDK desde Microsoft Passport Network.


Forms Authentication (ASP.NET) Aquí se realiza mediante un formulario solicitando el login y el password al usuario, cuando ASP.NET válida las credenciales como correctas crea una cookie encriptada que se adjunta a cada respuesta de petición, por eso se dice que esta autenticación es basada en token (token-based), si el runtime de ASP .NET no encuentra la cookie entonces redirige al usuario a la pantalla del login, este tipo de autenticación es la más personalizable y portable que las anteriores.

Estos mecanismos se utilizan en conjunto con la seguridad basada en roles de .NET (role-based security) que se fundamenta en dos conceptos importantes: identidades y principales.
La identidad de un usuario está representada en .NET por los siguientes tipos de identidades que se encuentran representadas en el Framework por clases que implementan la interfaz IIdentity.


Windows identity Se basa en los métodos de autenticación soportados por el sistema operativo Windows, esta identidad tiene la propiedad de hacerse pasar por otro usuario con la característica de impersonation(suplantación) además de ser una forma muy segura de autenticar usuarios.


Generic identity Se basa en un método personalizado de autenticación que se define a nivel aplicación, al ser un método personalizado por lo tanto no depende de las características del sistema de seguridad de Windows.



Passport identity Utiliza la autenticación del modulo de Passport de Microsoft donde los usuarios utilizan las credenciales de Hotmail o Windows Live para acceder a cualquier sistema que implemente el servicio Passport (single sign-inservice).



Si bien se recomienda utilizar los mecanismos proporcionados por el framework, .NET permite también crear mecanismos personalizados de autenticación implementando la interfaz IIdentity.



Código del programa ejemplo WindowsIdentitySample con la clase WindowsIdentity:

Al ejecutarse el programa mostrará la siguiente salida en Microsoft Windows:

Y la siguiente salida al ejecutarse en Linux utilizando Mono


A continuación el código de ejemplo del programa GenericIdentitySample utilizando la clase GenericIdentity:


Al ejecutarse el programa mostrará la siguiente salida en Microsoft Windows:

Y la siguiente salida al ejecutarse en Linux utilizando Mono

 Descarga el código fuente del ejemplo