首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NetSqlAzMan诉AzMan vs (?)

NetSqlAzMan诉AzMan vs (?)
EN

Stack Overflow用户
提问于 2012-01-05 21:52:30
回答 2查看 8.9K关注 0票数 13

我一直试图“在字里行间”阅读NetSqlAzMan项目的原始(和/或当前)动机。

这是写给你的吗?

  1. 用于Windows授权管理器(AzMan)的适配器。NetSqlAzMan中的方法只是将调用传递给( (AzMan)),但可能使用更好/更干净的方法?
  2. 替换(Windows授权管理器(AzMan))。其中(大部分或全部)可用的特性( (AzMan))是在NetSqlAzMan中重新创建的,但是代码是独立开发的。(也许是为了提供DotNet 4.0支持??)(可能是为了删除任何COM依赖项)
  3. 若要提供比( (AzMan))提供的更多功能,请执行以下操作。又名“更智能”/“更好”版本( (AzMan))。
  4. 重写,但也保持一个半死的项目通过开放源码活着。(也许((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而不是((AzMan))有什么好处?”

子问题是“(AzMan)死了吗?”(还有一些类似于NetSqlAzMan万岁的东西!)

..

我的一般要求是:

非活动目录用户。(接下来,Active和/或LDAP支持将是不错的,但不是一个要求)。密码不以纯文本形式存储。能够处理安全检查的权限。

将任何角色下的权利分组。为用户分配角色。(但同样,代码将检查右侧,而不是执行操作时的角色。)允许(有时)将权利分配给用户。有一个拒绝覆盖。(也就是,一个做傻事的用户(比如“删除雇员”)可以被撤销这个权利。)可以为多个应用程序维护角色和权限。

所以其他的想法是受欢迎的。但Windows标识基金会似乎有点过火了。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-06 14:54:12

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

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

我将在这里粘贴相关的部分(如下)。(以防该网站在未来不再存在。很小的机会,我知道,但我讨厌“答案在这里”的链接,当你点击链接,它是一个死的。

据我所知。

NetSqlAzMan提供了一个(表)用户定义的函数,您可以重载它来提供用户列表(分配给角色/任务)。NetSqlAzMan不仅提供了“你可以”映射(Grant),而且还提供了拒绝和授权-带-代理。NetSqlAzMan和Azman允许用户(组)进行角色映射。只有NetSqlAzMan允许用户执行任务映射。

看了几个样本后..。NetSqlAzMan的对象模型非常清晰。

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

Ms授权管理器(AzMan)与.NET Sql授权管理器(NetSqlAzMan) 如前所述,类似的Microsoft产品已经存在,名为授权管理器( AzMan );默认情况下,AzMan存在于Windows 2003中,并且通过管理包设置出现在Windows中。 AzMan和NetSqlAzMan的重要区别在于,第一种是基于角色的,即基于每个角色中的归属-角色概念和操作容器,而第二种是基于项的(或者如果您喜欢基于操作的话),即可以或不能属于角色或执行此类任务和/或操作(项)的用户或用户组。 在这里,这两种产品最重要的特点和区别是: AzMan女士: *是COM。*它配备了一个MMC 2.0 (COM)控制台。*它的存储可以是XML文件或ADAM (Active应用程序模式-e)。*是以角色为基础的。*它支持静态/动态应用程序组、成员/非成员。*基于角色->任务->操作的结构。(分层角色和任务,无操作)。*授权只能添加到角色中。*它没有执行“委托”概念。*它不管理“当时”的授权。*它不会触发事件。*唯一的授权类型是“允许”。(要“拒绝”,需要将用户/组从其角色中删除)。*它支持脚本/ Biz规则。*它支持用户/组和ADAM用户。 NetSqlAzMan: *它是.NET 2.0。*它配备了一个MMC3.0 (.NET)控制台。*它的存储是Server数据库(2000/MSDE/2005/Express)。*它基于Tdo类型的数据对象技术。*是以项目为基础的。*基于角色->任务->操作的结构。(都是等级的)。*授权可以添加到角色、任务和操作中。*它支持静态/动态应用程序组、成员/非成员。*直接从控制台进行LDAP查询测试。*这取决于时间。*符合代表要求。*触发事件(ENS)。*它支持4种授权类型:O允许有授权(授权和授权委托)。O允许(授权)。不否认(未经授权)。O中立(中立权限,它依赖于较高级别的项权限)。*等级授权。*它支持脚本/ Biz规则(用.NET - C# - VB编译而不是解释)*它支持在Server数据库中定义的Active Directory用户/组和自定义用户。

这是另一个问题。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
/// <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();
}

这本身就说明了一个故事。

票数 11
EN

Stack Overflow用户

发布于 2014-04-30 06:50:57

我认为微软在其博客和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已经有的一样。

为了用新的技术实现“良好的旧”但仍然是必要的“基于角色的安全”模式,需要进行更多的研究。

如果您想要开始,请向(WIF)迈进,该基金会最初出现在.NET 3.5.1中,但后来已经集成到.NET 4.5框架中。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8750367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档