2009-01-16 6 views
5

Tengo un formulario .aspx con 20 campos que deben deshabilitarse en función de un rol de usuario y un estado de un registro de orden. Actualmente la aplicación tiene 5 roles y 3 estados, por lo que tengo 300 condiciones posibles diferentes que tengo que tener en cuenta.¿Cómo se logra la seguridad a nivel de campo en ASP.Net?

Mi primer pensamiento es almacenar cada permutación en una tabla, luego establecer los campos cuando la página se carga al recorrer los campos. ¿Hay una mejor manera? Tenga en cuenta que estoy usando .Net 2.0 y NO MVC.

Respuesta

5

Probablemente almaceno los detalles de cada campo, y luego los roles y el estado que pueden editarlos, y lo hago de esa manera.

¿Cuáles son las reglas del sistema? Básicamente, ¿hay realmente 300 condiciones posibles? ¿O es realmente cierto que los campos solo son editables para cierto estado, y solo ciertos roles pueden editar esos campos? ¿O es que ciertos campos están disponibles para ciertos roles también?

Si se trata de más de lo primero probablemente tendría algo como esto:

tres tablas principales (hace que sea fácil de extender si se agrega un campo, el papel o el estado):

  • campos
  • Roles
  • estado

Luego, dos mesas de enlace:

  • Field.Id y Role.Id
  • Field.Id y Status.Id

Entonces, para cualquier orden dado y el usuario puede entonces encontrar qué campos son editables por el estado actual de la orden, y la función de los usuarios, y mientras trabaja en los campos, establezca los derechos de acceso de forma apropiada, independientemente de cómo configure los controles, ya sea generando dinámicamente en función de la colección que obtiene o estáticamente en la página.

Si tiene un problema donde la función puede anular el estado, también puede almacenar un booleano en la tabla de campo/función, que indica si el campo debe estar disponible independientemente del estado.

0

Sugiero utilizar un marco de terceros para lograr esto. Utilizamos el marco CSLA en nuestros proyectos. Nos permite establecer la autorización a nivel de campo.

3

Al igual que otro respondedor, también usamos un marco de objeto de negocio llamado CSLA. CSLA implementa controles de seguridad a nivel de campo al exigir a los desarrolladores de clases que realicen comprobaciones de seguridad en las llamadas de obtención/establecimiento de propiedades. Una aplicación típica propiedad se ve así:

Private mFirstName As String = "" 
Public Property FirstName() As String 
    <System.Runtime.CompilerServices.MethodImpl(Runtime.CompilerServices.MethodImplOptions.NoInlining)> _ 
    Get 
     CanReadProperty("FirstName", True) 
     Return mFirstName 
    End Get 
    <System.Runtime.CompilerServices.MethodImpl(Runtime.CompilerServices.MethodImplOptions.NoInlining)> _ 
    Set(ByVal value As String) 
     CanWriteProperty("FirstName", True) 
     If value Is Nothing Then value = "" 
     If Not mFirstName.Equals(value) Then 
      mFirstName = value 
      PropertyHasChanged("FirstName") 
     End If 
    End Set 
End Property 

Aviso las llamadas a CanReadProperty y CanWriteProperty. El segundo parámetro especifica que el método debe arrojar una excepción si el usuario no está autorizado para realizar la operación específica de lectura/escritura.

La implementación de CanReadProperty y CanWriteProperty es proporcionada por la clase base del marco, pero debe ser reproducible sin adoptar todo el marco CSLA. Las implementaciones comprueban una estructura de datos AuthorizationRules que define quién está permitido/denegado el acceso de Lectura/Escritura en función de los roles.A menudo, la estructura AuthorizationRules se rellena durante la creación del objeto.

Exponer los mismos métodos CanReadProperty y CanWriteProperty a su nivel de presentación le permite habilitar/deshabilitar los elementos de la IU en función de los derechos de acceso actuales del usuario. Por ejemplo:

FirstNameTextBox.ReadOnly = Not CanWriteProperty("FirstName", false) 

Esperamos que esta información le proporcione un buen punto de partida para desarrollar su propia implementación. Si está interesado en obtener más información sobre CSLA, consulte Expert C# 2008 Business Objects.

Cuestiones relacionadas