2012-01-05 41 views
11

He estado tratando de "leer entre líneas" sobre la motivación original (y/o actual) para el proyecto NetSqlAzMan.NetSqlAzMan vs AzMan vs (?????)

¿Fue esto escrito?

  1. Un adaptador para Windows Authorization Manager (AzMan). Donde los métodos en NetSqlAzMan solo pasan llamadas a (Administrador de autorización de Windows (AzMan)), pero quizás con métodos más claros/más limpios?

  2. Un reemplazo para (Windows Authorization Manager (AzMan)). Donde (la mayoría o todas) las funciones disponibles en (Windows Authorization Manager (AzMan)) se vuelven a crear en NetSqlAzMan, pero el código se desarrolló de forma independiente. (¿Tal vez para proporcionar compatibilidad con DotNet 4.0?) (Quizás para eliminar cualquier dependencia COM)

  3. Para proporcionar más funciones que (Administrador de autorización de Windows (AzMan)) proporcionadas. Aka, una versión "más inteligente"/"mejor" de (Windows Authorization Manager (AzMan)).

  4. Para reescribir, pero también mantener vivo un proyecto semi-muerto a través de código abierto. (Como en, tal vez (Windows Authorization Manager (AzMan))) es un proyecto muerto o abandonado por Microsoft).

  5. ¿Otro?

................

me gusta el modelo de objetos de NetSqlAzMan. Pero tengo que defender cualquier decisión de usarlo para mis gerentes de proyecto y otros desarrolladores. El modelo de objeto parece "justo" (piense en goldilocks y en la cama del medio) en cuanto a lo que deseo por seguridad. NO quiero hacer seguridad basada en roles. Quiero seguridad basada en la derecha (o tarea o permiso).

(Ver: http://lostechies.com/derickbailey/2011/05/24/dont-do-role-based-authorization-checks-do-activity-based-checks/ y http://granadacoder.wordpress.com/2010/12/01/rant-hard-coded-security-roles/ )

Y básicamente la pregunta que surgió es: "¿Cuál es la ventaja de utilizar NetSqlAzMan en lugar de (Windows Administrador de autorización (AzMan))"

Y la pregunta secundaria es "¿Está muerto el Administrador de autorización de Windows (AzMan)?". (¡Y algo parecido a Long Live NetSqlAzMan!).

..................

Mi en general los requisitos son:

Usuarios de Active Directory. (En el futuro, la compatibilidad con Active Directory y/o LDAP sería agradable, pero no un requisito). Contraseñas no almacenadas como texto sin formato. Ser capaz de manejar DERECHOS para verificaciones de seguridad.
Agrupe los derechos bajo cualquier rol. Asignar roles a los usuarios. (Pero, de nuevo, el código verificará el derecho, no el rol cuando se realiza una acción). Permita (en ocasiones) que se asignen derechos a los usuarios. Con una anulación de denegación. (Aka, un usuario único que hace algo estúpido (como "Eliminar empleado") puede revocar ese derecho). Roles y derechos se pueden mantener para múltiples aplicaciones.

Así que otras ideas son bienvenidas.Pero Windows Identity Foundation parece un poco excesivo.

Gracias.

Respuesta

10

Finalmente encontré un artículo "compare" anoche.

http://www.c-sharpcorner.com/uploadfile/a.ferendeles/netsqlazman12122006123316pm/netsqlazman.aspx

voy a pegar la parte relevante aquí (abajo). (Solo en caso de que ese sitio web deje de existir en el futuro. Pequeña posibilidad, lo sé, pero odio los enlaces "La respuesta está aquí", y cuando tocas el enlace, está muerto).

De qué Puedo decir.

NetSqlAzMan proporciona una función (tabla) definida por el usuario que puede sobrecargar para proporcionar una lista de usuarios (para asignarlos a roles/tareas). NetSqlAzMan proporciona no solo asignaciones de "sí se puede" (Grant), sino también Denegar y Otorgar-Con-Delegar también. NetSqlAzMan y Azman permiten a los usuarios (grupos) realizar asignaciones de roles. Solo NetSqlAzMan permite a los usuarios realizar asignaciones de Tareas.

Después de ver algunas muestras ... el modelo de objetos de NetSqlAzMan es muy limpio.

============================================== =========

Sra Administrador de autorización (AzMan) vs .NET SQL Administrador de autorización (NetSqlAzMan)

Como se señaló antes, un producto de Microsoft análoga ya existe y se llama Administrador de autorizaciones (AzMan); AzMan está presente, por defecto en , en Windows Server 2003 y, a través de la configuración del paquete de administración, en Windows XP.

La diferencia importante entre AzMan y NetSqlAzMan es que el primera es basada en roles, es decir, en base a la que pertenece - concepto de rol y el contenedor de operaciones en cada función, mientras que el segundo es a base de artículo (o si prefiere Operación), es decir usuarios o usuarios grupo o grupo de grupos que pueden o no pertenecer a Roles o ejecutar tal Tarea y/u Operaciones (Artículos).

Aquí las características más importantes y las diferencias entre los dos productos:

Sra AzMan:

* It's COM. 
* It's equipped by a MMC 2.0 (COM) console. 
* Its storage can be an XML file or ADAM (Active Directory Application Mode - e un LDAP). 
* It's role-based. 
* It supports static/dynamic applicative groups, members/not-members. 
* Structure based on Roles -> Tasks -> Operations. (Hierarchical Roles and Tasks , none Operations). 
* Authorizations can be added only to Roles. 
* It doesn't implement the "delegate" concept. 
* It doesn't manage authorizations "in the time". 
* It doesn't trigger events. 
* The only type of authorization is "Allow". 
    (to "deny" it needs to remove the user/group from his Role). 
* It supports Scripting/Biz rules. 
* It supports Active Directory users/groups and ADAM users. 

NetSqlAzMan:

* It's .NET 2.0. 
* It's equipped by a MMC 3.0 (.NET) console. 
* Its storage is a Sql Server database(2000/MSDE/2005/Express). 
* It's based on Tdo - Typed Data Object technology. 
* It's Item-based. 
* Structure based on Roles -> Tasks -> Operations. (all hierarchical ones). 
* Authorizations can be added to Roles, Task and Operations. 
* It supports static/dynamic applicative groups, members/not-members. 
* LDAP query testing directly from console. 
* It's time-dependant. 
* It's delegate-compliant. 
* It triggers events (ENS). 
* It supports 4 authorization types: 
     o Allow with delegation (authorized and authorized to delegate). 
     o Allow (authorized). 
     o Deny (not authorized). 
     o Neutral (neutral permission, it depends on higher level Item permission). 
* Hierarchical authorizations. 
* It supports Scripting/Biz rules (compiled in .NET - C# - VB - and not interpreted) 
* It supports Active Directory users/groups and custom users defined in SQL Server Database. 

Aquí hay otro Gotcha.

Azman código de ejemplo: http://channel9.msdn.com/forums/sandbox/252978-AzMan-in-the-Enterprise-Sample-Code http://channel9.msdn.com/forums/sandbox/252973-Programming-AzMan-Sample-Code

using System; 
using System.Security.Principal; 
using System.Runtime.InteropServices; 
using AZROLESLib; 

namespace TreyResearch { 
    public class AzManHelper : IDisposable { 

     AzAuthorizationStore store; 
     IAzApplication app; 
     string appName; 

     public AzManHelper(string connectionString, string appName) { 

      this.appName = appName; 

      try { 
       // load and initialize the AzMan runtime 
       store = new AzAuthorizationStore(); 
       store.Initialize(0, connectionString, null); 

       // drill down to our application 
       app = store.OpenApplication(appName, null); 
      } 
      catch (COMException x) { 
       throw new AzManException("Failed to initizlize AzManHelper", x); 
      } 
      catch (System.IO.FileNotFoundException x) { 
       throw new AzManException(string.Format("Failed to load AzMan policy from {0} - make sure your connection string is correct.", connectionString), x); 
      } 
     } 

     public void Dispose() { 
      if (null == app) return; 

      Marshal.ReleaseComObject(app); 
      Marshal.ReleaseComObject(store); 

      app = null; 
      store = null; 
     } 

     public bool AccessCheck(string audit, Operations op, 
           WindowsIdentity clientIdentity) { 

      try { 
       // first step is to create an AzMan context for the client 
       // this looks at the security identifiers (SIDs) in the user's 
       // access token and maps them onto AzMan roles, tasks, and operations 
       IAzClientContext ctx = app.InitializeClientContextFromToken(
        (ulong)clientIdentity.Token.ToInt64(), null); 

       // next step is to see if this user is authorized for 
       // the requested operation. Note that AccessCheck allows 
       // you to check multiple operations at once if you desire 
       object[] scopes = { "" }; 
       object[] operations = { (int)op }; 
       object[] results = (object[])ctx.AccessCheck(audit, scopes, operations, 
                  null, null, null, null, null); 
       int result = (int)results[0]; 
       return 0 == result; 
      } 
      catch (COMException x) { 
       throw new AzManException("AccessCheck failed", x); 
      } 
     } 

     public bool AccessCheckWithArg(string audit, Operations op, 
             WindowsIdentity clientIdentity, 
             string argName, object argValue) { 

      try { 
       // first step is to create an AzMan context for the client 
       // this looks at the security identifiers (SIDs) in the user's 
       // access token and maps them onto AzMan roles, tasks, and operations 
       IAzClientContext ctx = app.InitializeClientContextFromToken(
        (ulong)clientIdentity.Token.ToInt64(), null); 

       // next step is to see if this user is authorized for 
       // the requested operation. Note that AccessCheck allows 
       // you to check multiple operations at once if you desire 
       object[] scopes = { "" }; 
       object[] operations = { (int)op }; 
       object[] argNames = { argName }; 
       object[] argValues = { argValue }; 
       object[] results = (object[])ctx.AccessCheck(audit, scopes, operations, 
                  argNames, argValues, 
                  null, null, null); 
       int result = (int)results[0]; 
       return 0 == result; 
      } 
      catch (COMException x) { 
       throw new AzManException("AccessCheckWithArg failed", x); 
      } 
     } 

     // use this to update a running app 
     // after you change the AzMan policy 
     public void UpdateCache() { 
      try { 
       store.UpdateCache(null); 
       Marshal.ReleaseComObject(app); 
       app = store.OpenApplication(appName, null); 
      } 
      catch (COMException x) { 
       throw new AzManException("UpdateCache failed", x); 
      } 
     } 
    } 

    public class AzManException : Exception { 
     public AzManException(string message, Exception innerException) 
      : base(message, innerException) 
     {} 
    } 
} 

Es decir código ayudante Azman. Eso es feo cosas COM/Interopish.: <

Ahora compruebe los ejemplos de código NetSqlAzMan:

http://netsqlazman.codeplex.com/wikipage?title=Samples

/// <summary> 
/// Create a Full Storage through .NET code 
/// </summary> 
private void CreateFullStorage() 
{ 
    // USER MUST BE A MEMBER OF SQL DATABASE ROLE: NetSqlAzMan_Administrators 

    //Sql Storage connection string 
    string sqlConnectionString = "data source=(local);initial catalog=NetSqlAzManStorage;user id=netsqlazmanuser;password=password"; 
    //Create an instance of SqlAzManStorage class 
    IAzManStorage storage = new SqlAzManStorage(sqlConnectionString); 
    //Open Storage Connection 
    storage.OpenConnection(); 
    //Begin a new Transaction 
    storage.BeginTransaction(AzManIsolationLevel.ReadUncommitted); 
    //Create a new Store 
    IAzManStore newStore = storage.CreateStore("My Store", "Store description"); 
    //Create a new Basic StoreGroup 
    IAzManStoreGroup newStoreGroup = newStore.CreateStoreGroup(SqlAzManSID.NewSqlAzManSid(), "My Store Group", "Store Group Description", String.Empty, GroupType.Basic); 
    //Retrieve current user SID 
    IAzManSid mySid = new SqlAzManSID(WindowsIdentity.GetCurrent().User); 
    //Add myself as sid of "My Store Group" 
    IAzManStoreGroupMember storeGroupMember = newStoreGroup.CreateStoreGroupMember(mySid, WhereDefined.Local, true); 
    //Create a new Application 
    IAzManApplication newApp = newStore.CreateApplication("New Application", "Application description"); 
    //Create a new Role 
    IAzManItem newRole = newApp.CreateItem("New Role", "Role description", ItemType.Role); 
    //Create a new Task 
    IAzManItem newTask = newApp.CreateItem("New Task", "Task description", ItemType.Task); 
    //Create a new Operation 
    IAzManItem newOp = newApp.CreateItem("New Operation", "Operation description", ItemType.Operation); 
    //Add "New Operation" as a sid of "New Task" 
    newTask.AddMember(newOp); 
    //Add "New Task" as a sid of "New Role" 
    newRole.AddMember(newTask); 
    //Create an authorization for myself on "New Role" 
    IAzManAuthorization auth = newRole.CreateAuthorization(mySid, WhereDefined.Local, mySid, WhereDefined.Local, AuthorizationType.AllowWithDelegation, null, null); 
    //Create a custom attribute 
    IAzManAttribute<IAzManAuthorization> attr = auth.CreateAttribute("New Key", "New Value"); 
    //Create an authorization for DB User "Andrea" on "New Role" 
    IAzManAuthorization auth2 = newRole.CreateAuthorization(mySid, WhereDefined.Local, storage.GetDBUser("Andrea").CustomSid, WhereDefined.Local, AuthorizationType.AllowWithDelegation, null, null); 
    //Commit transaction 
    storage.CommitTransaction(); 
    //Close connection 
    storage.CloseConnection(); 
} 

que cuenta una historia en sí misma.

+0

sólo quería señalar que el artículo y los puntos de hecho sobre azman eran de un artículo publicado en 2006. Azman fue actualizado y mejorado (escpecially el apoyo de la API y SQL Server tienda) cuando Windows Server 2008 salió. Pero todavía parece que Azman ha sido abandonado. La última actualización del blog del equipo Azman es de 2008. – Haydar

+0

Gracias por el consejo. No para cargar en Azman, pero el hecho de que está vinculado a versiones específicas de O/S ... también es un problema para mí. Pero podría haber sido una de esas cosas que fue la inspiración para algunas cosas mejores ... – granadaCoder

+0

Es NETSQL Azman dependiente de Windows Azman de alguna manera. Dado que Azman puede estar obsoleto en las futuras versiones de Windows, ¿eso significa que NETSQL Azman no funcionará cuando eso suceda? – Donny

2

Creo que la razón de la falta de actualizaciones de Microsoft en sus blogs y en sus SDK tiene algo que ver con ellos ya en movimiento todas sus herramientas y diseña hacia una red social/federación amigable "afirma modelo":

http://msdn.microsoft.com/en-us/magazine/ee335707.aspx

En comparación con cualquiera de las variantes de AzMan, en el bajo nivel de operación de AzMan (lo que el código exige para desacoplarlo del resto) solo tenemos un reclamo de tipo de permiso. Este nuevo estilo de operación es simplemente un nombre de cadena/acción URN emitido desde cualquier proveedor/servicio de reclamaciones confiable validado por las firmas que usted (o la reconfiguración posterior) definen. Entonces son solo una lista plana de roles en la identidad del usuario tan fácil de verificar con los métodos comunes de IsInRole.

La justificación para esto es clara. Las soluciones de Internet modernas (y tal vez algunas aplicaciones corporativas de intranet una vez que se mejoran las leyes de privacidad) exigen autenticación y autorización de múltiples dominios, p. esta cuenta de usuario de StackOverflow.com y la cuenta de Facebook conectada o cualquier cuenta de OpenID que pueda haber vinculado.

Por lo tanto, para la autorización, ahora puede CODEAR las reglas que mapean entre las reclamaciones externas y las "reclamaciones de permisos" internas (análogas a las operaciones AzMan). Sin embargo, no hay una herramienta estándar de formato, jerarquía o administración.

Quizás una solución híbrida de Servicio de reclamaciones (Autenticación) + AzMan XML/SQL (Asignación de roles a reclamos) + Reclamaciones La demanda de permisos es el camino a seguir. Todas las muestras que encontré hasta ahora solo tienen código en el medio. Quiero ver algo con membresías de grupo recursivas de Active Directory resuelto a Roles a Tareas a reclamos (operaciones) como ya lo hicimos con AzMan.

Más investigación es necesaria para lograr los "buenos", pero sigue siendo esencial patrón de "papel de seguridad con base" con la nueva tecnología ...

Si usted está buscando para iniciar, en dirección a la Fundación Microsoft Windows Identity (WIF) que apareció por primera vez en .NET 3.5.1 pero desde entonces se ha integrado en el marco .NET 4.5.

http://msdn.microsoft.com/en-us/library/hh377151(v=vs.110).aspx

+0

Para futuros lectores ... He abandonado completamente la "vieja escuela" y ahora uso la autorización de reclamos. Es una pequeña joroba para superar, pero funciona al final. – granadaCoder

Cuestiones relacionadas