13

NetSqlAzMan プロジェクトの元の (および/または現在の) 動機について、「行間を読む」ことを試みてきました。

これは何のために書かれたのですか?

  1. Windows Authorization Manager (AzMan) 用のアダプター。NetSqlAzMan のメソッドは (Windows Authorization Manager (AzMan)) に呼び出しを渡すだけですが、おそらくより適切でクリーンなメソッドを使用していますか?

  2. (Windows Authorization Manager (AzMan)) の代替。(Windows Authorization Manager (AzMan)) で利用可能な (ほとんどまたはすべての) 機能は NetSqlAzMan で再作成されますが、コードは個別に開発されました。(おそらく DotNet 4.0 サポートを提供するため???) (おそらく、COM 依存関係を削除するため)

  3. (Windows Authorization Manager (AzMan)) よりも多くの機能を提供するため。別名、(Windows Authorization Manager (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/ )

基本的に出てきた質問は、「(Windows Authorization Manager (AzMan)) の代わりに NetSqlAzMan を使用する利点は何ですか?」というものです。

サブ質問は「Windows Authorization Manager (AzMan) は死んでいますか?」です。(そして、Long Live NetSqlAzMan! に沿った何か)。

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

私の一般的な要件は次のとおりです。

非 Active Directory ユーザー。(将来的には、Active Directory や LDAP のサポートがあればよいのですが、必須ではありません)。プレーン テキストとして保存されていないパスワード。セキュリティ チェックの RIGHTS を処理できる。
権限を任意の役割の下にグループ化します。ユーザーにロールを割り当てます。(ただし、コードは、アクションを実行するときにロールではなく、権限をチェックします。) (場合によっては) ユーザーに権限を割り当てることを許可します。Deny オーバーライドあり。(別名、愚かなこと(「従業員の削除」など)を行う単一のユーザーは、その権利を取り消すことができます。)複数のアプリケーションに対して役割と権利を維持できます。

したがって、他のアイデアは大歓迎です。しかし、Windows Identity Foundationは少しやり過ぎのように思えます。

ありがとう。

4

2 に答える 2

11

私はついに昨夜「比較」記事を見つけました。

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

ここ(下)に関連部分を貼り付けます。(将来的にウェブサイトが存在しなくなった場合に備えて。チャンスは少ないですが、「答えはここにあります」というリンクは嫌いです。リンクを押すと、死んでしまいます。)

私が言えることから。

NetSqlAzManは、(ロール/タスクに割り当てられる)ユーザーのリストを提供するためにオーバーロードできる(テーブル)ユーザー定義関数を提供します。NetSqlAzManは、「Yeah you can」マッピング(Grant)だけでなく、DenyおよびGrant-With-Delegateも提供します。NetSqlAzManおよびAzmanを使用すると、ユーザー(グループ)がマッピングをロールできます。NetSqlAzManのみが、ユーザーにタスクマッピングを許可します。

いくつかのサンプルを見た後...NetSqlAzManのオブジェクトモデルは非常にきれいです。

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

Ms Authorization Manager(AzMan)と.NET Sql Authorization Manager(NetSqlAzMan)

前に指摘したように、類似のMicrosoft製品はすでに存在し、Authorization Manager(AzMan)と呼ばれています。AzManは、既定ではWindows Server 2003に存在し、管理パックのセットアップを通じてWindowsXPに存在します。

AzManとNetSqlAzManの重要な違いは、1つ目はロールベース、つまり、所属するロールの概念と各ロールの操作コンテナーに基づくものであり、2つ目はアイテムベース(または操作ベースの場合)であるということです。 、つまり、ロールに所属したり、そのようなタスクや操作(アイテム)を実行したりできないユーザーまたはユーザーグループまたはグループのグループです。

ここでは、2つの製品の最も重要な機能と違いを示します。

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

ここにもう1つの落とし穴があります。

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

それ自体が物語です。

于 2012-01-06T14:54:12.053 に答える
2

Microsoft がブログや SDK で更新を行わない理由は、Microsoft がすべてのツールとデザインをソーシャル ネットワーク/フェデレーションに適した "クレーム モデル" に移行していることに関係していると思います。

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

AzMan の亜種のいずれかと比較すると、低い AzMan 操作レベル (コードが残りの部分から分離するために要求するもの) では、アクセス許可タイプのクレームしかありません。この新しいスタイルの操作は、ユーザー (または後で再構成) が定義する署名によって検証された、信頼できるクレーム プロバイダー/サービスから発行された単なる URN 文字列/アクション名です。これらは、ユーザー ID のロールの単純なリストにすぎないため、一般的な IsInRole メソッドで簡単に確認できます。

この理由は明らかです。最新のインターネット ソリューション (および、プライバシーに関する法律が改善された後の将来の企業イントラネット アプリケーション) では、マルチドメインの認証と承認が要求されます。たとえば、この StackOverflow.com ユーザー アカウントと接続された Facebook アカウント、またはリンクされている可能性のある OpenID アカウントなどです。

そのため、承認のために、外部クレームと内部「許可クレーム」の間をマッピングするルールをコード化できるようになりました (AzMan 操作に類似)。ただし、標準のフォーマット、階層、または管理ツールはありません。

おそらく、Claims Service (認証) + AzMan XML/SQL (Roles to Claims マッピング) + Claims Permission 要求のハイブリッド ソリューションが前進する方法です。これまでに見つけたすべてのサンプルは、コードが真ん中にあるだけです。AzMan で既に行っているように、Active Directory からの再帰的なグループ メンバーシップが役割、タスク、クレーム (操作) に解決されるものを見たいと思っています。

「古き良き」が依然として不可欠な「役割ベースのセキュリティ」パターンを新しいテクノロジで達成するには、さらに調査が必要です...

開始しようとしている場合は、.NET 3.5.1 で最初に登場し、その後 .NET 4.5 フレームワークに統合された Microsoft Windows Identity Foundation (WIF) に向かいます。

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

于 2014-04-30T06:50:57.397 に答える