http://www.microsoft.com/learning/en/us/exam.aspx?ID=70-536&locale=en-us
Este es otro de los resúmenes que he rescatado. Va de la gestión de la seguridad en el .net Framework.
Como curiosidad, indicar que en la RAE sólo existe el término Autenticación, y no Autentificación. Se define autenticación como la acción y el efecto de autenticar, y autenticar es "autorizar o legalizar algo", o bien "dar fe de la verdad de un hecho o documento con autoridad legal" (fuente: diccionario online de la RAE). Creo que conocer el significado de las palabras es importante para aclarar nuestras ideas y trasmitirlas con fidelidad a nuestros pensamientos. Por eso me detengo en estos detalles.
Obs de último momento: Están admitidos tanto el verbo autenticar como autentificar. Ambos términos tienen el mismo significado. Ver + info aquí.
Bueno… a lo que íbamos.
En la jerga informática, que es la que nos interesa…
Autenticación: Es el proceso de identificación de un usuario.
Autorización: Es proceso por el que permite o deniega el acceso de un usuario a un recurso.
La clase System.Security.Principal.WindowsIdentity representa un usuario de Windows. No permite autenticar a un usuario; solo guarda el resultado de la autenticación. Estos son sus métodos más importantes:
GetAnonymous (shared)
|
Devuelve un objeto WindowsIdentity que representa a un usuario anónimo. |
GetCurrent (shared)
|
Devuelve un objeto WindowsIdentity que representa el usuario actual de Windows. |
Impersonate (shared)
|
Devuelve un objeto WindowsImpersonationContext que representa un usuario concreto del sistema. Permite al código que se está ejecutando reemplazar a otro usuario de Windows. |
GetCurrent
|
Devuelve el objeto WindowsPrincipal correspondiente al usuario. |
Estas son propiedades (no estáticas) de WindowsIdentity
AuthenticationType
|
String que indica el método de autenticación. Generalmente "NTLM". |
IsAnonymous
|
bool que indica si el usuario es anónimo. |
IsAuthenticated
|
bool que indica si el usuario ha sido autenticado. |
IsGuest
|
bool que indica si el usuario es un usuario "guest" o invitado. |
IsSystem
|
bool que indica si el usuario es un usuario de sistema. |
Name
|
string con el nombre de usuario y el dominio en el que ha sido autenticado. Si posee una barra invertida () dentro del nombre, indica que el usuario ha si do autenticado por un dominio de Active Directory. En caso contrario la autenticación se produjo contra el equipo local. |
Token
|
int con el token identificador del usuario. |
La clase WindowsPrincipal proporciona acceso a los grupos de los que un usuario es miembro. Esta clase debe ser creada pasando como parámetro de su constructor una instancia de WindowsIdentity, o bien llamando al método GetCurrent() de WindowsIdentity. Estos son algunos de sus métodos:
|
bool que indica si el usuario es miembro del grupo especificado.
|
Las clases PrincipalPermission y PrincipalPermissionAttribute permiten, en conjunto, saber si el usuario cumple o no unos criterios de autorización determinados.
Estas son las propiedades de PrincipalPermission
Authenticated
|
bool que en caso de ser true, indica que el usuario debe estar autenticado para poseer la autorización. |
Name
|
string que indica el nombre que debe tener el usuario para poseer la autorización. |
Role
|
string que indica el nombre del grupo al que debe pertenecer el usuario para poseer la autorización. |
Métodos de PrincipalPermission
Demand
|
Comprueba que el usuario cumpla con los criterios de Authenticated, Name y Role especificados en sus propiedades. En caso contrario, se lanza una SecurityException. |
Seguridad Declarativa (Declarative RBS Demands): Indica al runtime, mediante atributos, que realize comprobaciones Role-Based Security (Seguridad basada en Roles) antes de ejecutar el código de un ensamblado, clase o método.
Usar este tipo de atributos es la manera más segura de impedir la ejecución de código a usuarios no autorizados, aunque posee algunos inconvenientes.
Para usar estos atributos, es no olvidar realizar los siguientes pasos:
– Realizar una llamada a System.AppDomain.CurrentDomain.SetPrincipalPolicy indicando la política de seguridad para el IPrincipal (usuario) que ejecutará nuestro código.
– Un bloque try catch para capturar accesos no autorizados. Si se denegara el acceso se lanzaría una SecurityException.
– Los atributos PrincipalPermission para declarar los accesos requeridos al ensamblado, clase o método cuyo acceso se desee restringir.
Seguridad Imperativa
Las validaciones usadas en la seguridad imperativa se realizan dentro del código y eliminan la limitación de la seguridad declarativa de restringir los accesos a grandes porciones de código.
Los pasos para incluir la seguridad imperativa en el código son los siguientes:
– Realizar una llamada a System.AppDomain.CurrentDomain.SetPrincipalPolicy indicando la política de seguridad para el IPrincipal (usuario) que ejecutará nuestro código.
– Un bloque try catch para capturar accesos no autorizados. Si se denegara el acceso se lanzaría una SecurityException.
– Un objeto PrincipalPermission para especificar las restricciones que aplicarán al código.
– Una llamada a PrincipalPermission.Demand() para verificar que el IPrincipal especificado está autorizado.
La clase PrincipalPermission posee 3 constructores:
– PrincipalPermission(PermissionState): el enum PermissionState indica si la política de autorización es restrictiva o permisiva, es decir, si de primeras no autorizamos al recurso a menos que cumpla el resto de requisitos, o si de primeras autorizamos al recurso, a menos que cumpla los requisitos.
– PrincipalPermission(Name, Role): Especifica como requisitos de autorización un nombre de usuario y un rol determinado.
– PrincipalPermission(Name, Role, Authenticated) Especifica como requisitos de autorización un nombre de usuario, un rol y un estado de autorización determinados.
Implementando usuarios y roles(grupos) propios
Para realizar esta tarea es necesario implementar las interfaces System.Security.Principal.IIdentity y System.Security.Principal.IPrincipal. Estas interfaces permiten utilizar la infraestructura de acceso y autenticación de la plataforma. De hecho, las clases WindowsIdentity y WindowsPrincipal las implementan. De igual modo, en asp.net existen la clase FormsIdentity y PassportIdentity que también son implementaciones de estas intefaces.
Con lo cual, para implementar nuestro propio motor de autenticación y gestión de grupos y usuario, tirando por ejemplo, contra una base de datos, debemos, bien heredar de alguna de las clases vistas anteriormente o implementar estas interfaces.
Propiedades de IIdentity
AuthenticationType
|
string para determinar el tipo de autenticación a usar. Para usar el de windows, NTLM. |
IsAuthenticated
|
booleano que indica si el proceso de autenticación ha sido válido. |
Name
|
string con el nombre de usuario. |
Métodos de IPrincipal
Identity
|
Objeto IIdentity que determina la identidad del usuario |
IsInRole
|
bool que indica si el Identity pertenece al grupo o rol especificados. |
La excepción System.Security.Authentication.AuthenticationException se lanza cuando se produce un error de autenticación.
La excepción System.Security.Authentication.InvalidCredentialException se lanza cuando el sistema ha denegado nuestra autenticación y no podemos volver a intentar autenticarnos.
Crossposted from crisfervil.com