13

我一直在尝试“从字里行间”了解 NetSqlAzMan 项目的原始(和/或当前)动机。

这是写的吗?

  1. Windows 授权管理器 (AzMan) 的适配器。NetSqlAzMan 中的方法只是将调用传递给(Windows 授权管理器(AzMan)),但可能使用更好/更清洁的方法?

  2. (Windows 授权管理器 (AzMan)) 的替代品。在 NetSqlAzMan 中重新创建了(Windows 授权管理器 (AzMan))中可用的(大部分或全部)功能,但代码是独立开发的。(也许提供 DotNet 4.0 支持???)(也许删除任何 COM 依赖项)

  3. 提供比 (Windows Authorization Manager (AzMan)) 提供的更多功能。也就是(Windows 授权管理器 (AzMan))的“更智能”/“更好”版本。

  4. 通过开源重写但也保持一个半死的项目活着。(如,也许(Windows 授权管理器(AzMan)))是微软的一个已死或废弃的项目)。

  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 支持会很好,但不是必需的)。密码不存储为纯文本。能够处理 RIGHTS 进行安全检查。
对任何角色下的权限进行分组。为用户分配角色。(但同样,代码将在执行操作时检查权限,而不是角色。)允许(有时)将权限分配给用户。使用拒绝覆盖。(又名,一个做愚蠢事情的用户(比如“删除员工”)可以撤销该权利。)可以为多个应用程序维护角色和权利。

所以欢迎其他想法。但Windows Identity Foundation似乎有点矫枉过正。

谢谢。

4

2 回答 2

11

昨晚我终于找到了一篇“比较”的文章。

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 产品已经存在,称为 Authorization Manager (AzMan);默认情况下,AzMan 存在于 Windows Server 2003 中,并且通过 Admin Pack 安装程序存在于 Windows XP 中。

AzMan 和 NetSqlAzMan 的重要区别在于,第一个是 Role-based,即基于所属 - Role 概念和每个角色中的操作容器,而第二个是 Item-based(或者如果您更喜欢 Operation-based) ,即可以或不可以属于角色或执行此类任务和/或操作(项目)的用户或用户组或组组。

这里最重要的特点和两个产品之间的区别:

阿兹曼女士:

* 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 -示例代码

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=样本

/// <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();
}

这本身就讲述了一个故事。

于 2012-01-06T14:54:12.053 回答
2

我认为微软在他们的博客和 SDK 中缺乏更新的原因与他们已经将所有工具和设计转向社交网络/联盟友好的“声明模型”有关:

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

与任何 AzMan 变体相比,在较低的 AzMan 操作级别(代码要求将其与其余部分分离)我们只有权限类型声明。这种新的操作方式只是一个 URN 字符串/操作名称,由您(或以后重新配置)定义的签名验证的任何受信任的声明提供程序/服务发出。然后,它们只是用户身份中角色的平面列表,因此可以使用常见的 IsInRole 方法轻松检查。

这样做的理由很清楚。现代互联网解决方案(一旦隐私法得到改进,可能还有一些未来的企业内部网应用程序)需要多域身份验证和授权,例如这个 StackOverflow.com 用户帐户和连接的 Facebook 帐户或您可能已链接的任何 OpenID 帐户。

因此,对于授权,您现在可以编写在外部声明和内部“权限声明”之间映射的规则(类似于 AzMan 操作)。然而,没有标准的格式、层次结构或管理工具。

也许声明服务(身份验证)+ AzMan XML/SQL(角色到声明映射)+声明权限需求的混合解决方案是前进的方向。到目前为止,我发现的所有示例都只是中间有代码。我希望看到从 Active Directory 递归组成员身份解析为角色到任务到声明(操作)的东西,就像我们在 AzMan 中已经拥有的那样。

有必要进行更多调查,以使用更新的技术实现“良好的旧”但仍然必不可少的“基于角色的安全”模式......

如果您想开始,请前往 Microsoft Windows Identity Foundation (WIF),它最初出现在 .NET 3.5.1 中,但后来被集成到 .NET 4.5 框架中。

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

于 2014-04-30T06:50:57.397 回答