NetSqlAzMan против AzMan против (?????)
Я пытался "прочитать между строк" о первоначальной (и / или текущей) мотивации для проекта NetSqlAzMan.
Это было написано для?
Адаптер для диспетчера авторизации Windows (AzMan). Где методы в NetSqlAzMan просто передают вызовы (Диспетчер авторизации Windows (AzMan)), но, возможно, с более хорошими / более чистыми методами?
Замена для (Диспетчер авторизации Windows (AzMan)). Где (большинство или все) функции, доступные в (Windows Authorization Manager (AzMan)), воссоздаются в NetSqlAzMan, но код был разработан независимо. (Возможно, чтобы обеспечить поддержку DotNet 4.0???) (Возможно, чтобы удалить любые зависимости COM)
Предоставить больше функций, чем (Диспетчер авторизации Windows (AzMan)). Ака, "умнее"/"лучше" версии (Windows Authorization Manager (AzMan)).
Переписать, но также поддерживать полуживой проект с открытым исходным кодом. (Как и, возможно, (Windows Authorization Manager (AzMan))) - это мертвый или заброшенный проект Microsoft).
Другой?
................
Мне нравится объектная модель 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 Authorization Manager (AzMan)))?"
И дополнительный вопрос: "Менеджер авторизации Windows (AzMan) мертв?". (И что-то вроде Long Live NetSqlAzMan!).
..................
Мои общие требования:
Пользователи не из Active-Directory. (В будущем поддержка Active Directory и / или LDAP была бы хорошей, но не обязательной). Пароли не хранятся в виде обычного текста. Уметь обращаться с ПРАВАМИ на проверки безопасности.
Сгруппируйте права под любую роль. Назначьте роли пользователям. (Но опять же, код будет проверять право, а не роль при выполнении действия.) Разрешить (иногда) права, которые будут назначены пользователям. С запретом отмены. (Ака, один пользователь, который делает глупости (например, "Удалить сотрудника"), может отменить это право.) Роли и права могут поддерживаться для нескольких приложений.
Так что другие идеи приветствуются. Но Windows Identity Foundation кажется немного излишним.
Благодарю.
2 ответа
Я наконец нашел статью "сравнить" прошлой ночью.
http://www.c-sharpcorner.com/uploadfile/a.ferendeles/netsqlazman12122006123316pm/netsqlazman.aspx
Я собираюсь вставить соответствующую часть здесь (ниже). (На всякий случай, если этот сайт прекратит свое существование в будущем. Я знаю небольшой шанс, но я ненавижу ссылки "Ответ уже здесь", и когда вы нажимаете на ссылку, она становится мертвой.)
Из того, что я могу сказать.
NetSqlAzMan предоставляет (определенную пользователем) пользовательскую функцию (таблицу), которую вы можете перегрузить, чтобы предоставить список пользователей (назначаемых ролям / задачам).NET Sql AzMan предоставляет не только сопоставления "Да, вы можете" (Grant), но также Deny и Grant-With-Delegate.NET Sql AzMan и Azman позволяют пользователям (группам) сопоставлять роли. Только NetSqlAzMan позволяет пользователям отображать задачи.
Посмотрев несколько примеров... объектная модель NetSqlAzMan очень чистая.
================================================== =====
Ms Authorization Manager (AzMan) против.NET Sql Authorization Manager (NetSqlAzMan)
Как указывалось ранее, аналогичный продукт Microsoft уже существует и называется диспетчером авторизации (AzMan); По умолчанию AzMan присутствует в Windows Server 2003, а в настройках Admin Pack - в 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)
{}
}
}
Это вспомогательный код Azman. Это отвратительные вещи COM/Interopish.<
Теперь проверьте примеры кода 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();
}
Это рассказывает историю само по себе.
Я думаю, что причина отсутствия обновлений от Microsoft в их блогах и в их SDK как-то связана с тем, что они уже перемещают все свои инструменты и разработки в сторону "модели утверждений" для социальной сети / федерации:
http://msdn.microsoft.com/en-us/magazine/ee335707.aspx
По сравнению с любым из вариантов AzMan, на низком уровне работы AzMan (что требует код, чтобы отделить его от остальных), у нас есть только утверждение типа разрешения. Этот новый стиль работы представляет собой просто строку / имя действия URN, выданное любым надежным поставщиком утверждений / услугой, подтвержденным сигнатурами, которые вы (или позднее перенастроили) определяете. Затем они представляют собой простой список ролей в идентификаторе пользователя, который легко проверить с помощью обычных методов IsInRole.
Обоснование этого ясно. Современные интернет-решения (и, возможно, некоторые будущие корпоративные интранет-приложения после улучшения законов о конфиденциальности) требуют многодоменной аутентификации и авторизации, например, эта учетная запись пользователя Stackru.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%28v=vs.110%29.aspx