NetSqlAzMan против AzMan против (?????) - PullRequest
13 голосов
/ 06 января 2012

Я пытался «прочитать между строк» ​​исходную (и / или текущую) мотивацию для проекта NetSqlAzMan.

Было ли это написано для?

  1. Адаптер для диспетчера авторизации Windows (AzMan).Где методы в NetSqlAzMan просто передают вызовы (Диспетчер авторизации Windows (AzMan)), но, возможно, с более приятными и чистыми методами?

  2. Замена для (Диспетчер авторизации Windows (AzMan)),Где (большинство или все) функции, доступные в (Windows Authorization Manager (AzMan)), воссоздаются в NetSqlAzMan, но код был разработан независимо.(Возможно, чтобы обеспечить поддержку DotNet 4.0 ???) (Возможно, чтобы удалить любые зависимости COM)

  3. Чтобы обеспечить больше функций, чем предусмотрено (Диспетчер авторизации Windows (AzMan)).Ака, «умнее» / «лучше» версии (Диспетчер авторизации Windows (AzMan)).

  4. Переписать, а также поддерживать полуживой проект с открытым исходным кодом.(Как и, возможно, (Windows Authorization Manager (AzMan))) - это мертвый или заброшенный проект Microsoft).

  5. Другое?

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

Мне нравитсяобъектная модель NetSqlAzMan.Но мне нужно защищать любое решение, чтобы использовать его для моего менеджера (-ов) проекта и других разработчиков.Объектная модель кажется «просто правильной» (думаю, Златовласка и средняя кровать), насколько я хочу для безопасности.Я не хочу заниматься ролевой безопасностью.Я хочу права (или задачи, или разрешения) на основе безопасности.

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

И в основном возник вопрос:«В чем преимущество использования NetSqlAzMan вместо (диспетчера авторизации Windows (AzMan))?»

И дополнительный вопрос: «Менеджер авторизации Windows (AzMan) мертв?».(И что-то вроде Long Live NetSqlAzMan!).

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

Мои общие требования:

Не пользователи Active-Directory.(В будущем поддержка Active Directory и / или LDAP будет хорошей, но не обязательной).Пароли не хранятся в виде простого текста.Уметь обрабатывать ПРАВА для проверок безопасности.
Группировать права для любой роли.Назначьте роли пользователям.(Но опять же, код будет проверять право, а не роль при выполнении действия.) Разрешить (иногда) права, которые будут назначены пользователям.С запретом отмены.(Ака, один пользователь, который делает глупости (например, «Удалить сотрудника»), может отменить это право.) Роли и права могут поддерживаться для нескольких приложений.

Так что приветствуются другие идеи.Но Windows Identity Foundation выглядит немного излишним.

Спасибо.

Ответы [ 2 ]

11 голосов
/ 06 января 2012

Вчера вечером я наконец нашёл статью "сравнить".

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

Я собираюсь вставить соответствующую часть здесь (ниже). (На всякий случай, если этот веб-сайт прекратит свое существование в будущем. Я знаю небольшой шанс, но я ненавижу ссылки «Ответ здесь», и когда вы нажимаете на ссылку, она становится мертвой.)

Из того, что я могу сказать.

NetSqlAzMan предоставляет (табличную) пользовательскую функцию, которую вы можете перегрузить, чтобы предоставить список пользователей (назначаемых ролям / задачам). NetSqlAzMan предоставляет не только сопоставления «Да, вы можете» (Grant), но также Deny и Grant-With-Delegate. NetSqlAzMan и Azman позволяют пользователям (группам) сопоставлять роли. Только NetSqlAzMan позволяет пользователям отображать задачи.

После просмотра нескольких примеров ... объектная модель NetSqlAzMan очень чистая.

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

Диспетчер авторизации MS (AzMan) и Диспетчер авторизации .NET Sql (NetSqlAzMan)

Как указывалось ранее, аналогичный продукт Microsoft уже существует и называется диспетчером авторизации (AzMan); AzMan присутствует, по по умолчанию в Windows Server 2003 и с помощью установки пакета администратора в Windows XP.

Важное различие между AzMan и NetSqlAzMan заключается в том, что во-первых, на основе ролей, то есть на основе принадлежности - концепция роли и контейнер операций в каждой роли, а вторая На основе элементов (или, если вы предпочитаете Операции), то есть пользователи или пользователи группа или группа групп, которые могут или не могут принадлежать к ролям или выполнять такое задание и / или операции (предметы).

Здесь наиболее важные особенности и различия между двумя продукты:

Г-жа Азман:

* 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.

Вот еще одна ошибка.

Пример кода Azman: 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)
        {}
    }
}

Это код помощника Азмана. Это отвратительный материал COM / Interopish. <</p>

Теперь проверьте примеры кода 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();
}

Это рассказывает историю само по себе.

2 голосов
/ 30 апреля 2014

Я думаю, что причина отсутствия обновлений от Microsoft в их блогах и в их SDK как-то связана с тем, что они уже переместили все свои инструменты и разработки в «дружественную» для социальной сети / федерации «модель требований»:

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

По сравнению с любым из вариантов AzMan, на низком уровне работы AzMan (что требует код, чтобы отделить его от остальных), у нас есть только утверждение типа разрешения. Этот новый стиль работы представляет собой просто строку / имя действия URN, выданное любым надежным поставщиком утверждений / услугой, подтвержденным сигнатурами, которые вы (или более поздняя реконфигурация) определяете. Затем они представляют собой простой список ролей в идентификаторе пользователя, который легко проверить с помощью распространенных методов IsInRole.

Обоснование этого ясно. Современные интернет-решения (и, возможно, некоторые будущие корпоративные интранет-приложения после улучшения законов о конфиденциальности) требуют многодоменной аутентификации и авторизации, например, эта учетная запись пользователя StackOverflow.com и подключенная учетная запись Facebook или любая учетная запись OpenID, которую вы могли связать.

Таким образом, для авторизации вы можете теперь использовать правила CODE, которые отображаются между внешними утверждениями и внутренними «утверждениями о разрешениях» (аналогично операциям AzMan). Однако стандартного формата, иерархии или инструмента администрирования не существует.

Возможно, гибридное решение службы утверждений (аутентификация) + AzMan XML / SQL (сопоставление ролей и утверждений) + утверждения Требование разрешения - это путь вперед. Все примеры, которые я нашел до сих пор, содержат код посередине. Я хочу увидеть что-то с рекурсивным членством в группах от Active Directory, разрешенного к ролям и задачам к заявкам (операциям), как у нас с AzMan.

Необходимы дальнейшие исследования, чтобы достичь «старого доброго», но все еще необходимого паттерна «безопасности на основе ролей» с помощью новой технологии ...

Если вы хотите начать, направляйтесь в Microsoft Windows Identity Foundation (WIF), который впервые появился в .NET 3.5.1, но с тех пор был интегрирован в .NET 4.5 framework.

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

...