39

作成する新しいサービス (WCF、ADO.NET Data Services、おそらくクラウド内) を大量に設計し始めており、ポップアップする 1 つの質問は、どの認証および承認スキームを使用するかということです。少し!

基本的に、HTTP、HTTPS、TCP などのさまざまなプロトコルでユーザー (実際の人、および「仮想」アプリケーション/サービス ユーザー) を識別できるようにする必要があり、少なくとも一連の役割/許可をそれらに割り当てる必要があります。特定のデータを表示したり、特定の操作を実行したりします。

Windows グループ メンバーシップを単独で使用することは絶対にできません。サービスの外部コンシューマーが多数あり、内部ドメインにドメイン アカウントをセットアップする必要はありません。

したがって、主に3つのオプションがあると思います。

  1. ASP.NET メンバーシップ システムの使用 - ユーザーを作成し、そこにロールを割り当てる
  2. より粒度が高く、より成熟した、より精巧なシステムと思われる AzMan (承認マネージャー) を使用します (ユーザー、タスク、グループ - ユーザー + ロールだけでなく、3 つのレベル)
  3. 私たち自身のロール

まず、この3つのうちどれがお勧めですか?なんで?

第二に、私が見逃しているオプションは他にありますか?

ヒント、ポインタ、意見をありがとう!

マルク

PS: これまでの回答を見て、オプション #3 に投票する人の数に驚いています。私は、MS がこれらすべての要件を処理できる再利用可能なものを設計できると考えていたでしょう....

4

8 に答える 8

19

実際、答えはおそらく1と3の組み合わせです。

デフォルトのオプションが希望どおりに機能しない場合は、メンバーシップロール、またはプロファイルプロバイダーを作成することで、フレームワークが提供する多くのツールと機能を利用できます。

多くのクライアントサイトでこれを実行しました。たとえば、クライアントの1つでは、ほとんどのユーザーがCommerce Serverユーザーとして保存されており、Commerce Serverプロファイルシステムを使用しているため、メンバーシップおよびプロファイルプロバイダーを作成してそれらと通信しました。データストア-かなり単純な演習。


生のTCPを介して認証する必要があるため、ほとんどの人はおそらく3を選択します。これにより、標準のASP.NETメンバーシッププロバイダーのレイヤーを超えるレイヤーが導入されます。

MSが生成するもののほとんどは「大丈夫」または「十分に良い」ですが、「あまり標準的ではない」ことをしたいというエッジケースが常にあります。「基本認証」や「Windows認証」を超えて、平均的な開発者が理解しやすいものがあると思います。彼らは「これをWeb用に構築する」という賢明なオプションを採用しました。

WCFサービスに対して認証できるさまざまな方法を見ると、私が何を意味しているのかがわかります。これらさまざまな転送メカニズムを処理するように設計されているため、はるかに複雑です。

とはいえ、デフォルトの役割とプロファイルプロバイダーはかなり制限されています(役割:階層がないため、可能な役割ごとに確認するか、各役割をユーザーに明示的に割り当てる必要があります;プロファイル:すべてコンマ区切りの値として1つのフィールドに格納されます-値セットを持っているすべてのユーザーを簡単に見つけることができます)。

于 2009-04-16T19:14:11.803 に答える
6

(3)を使います。実際、それは統合環境でアカウントを同期するのに役立ちました

  1. ビジネスプロセス
  2. その他のシステム (すべてが同じテクノロジ スタック (ASP.NET) にあるわけではありません)
于 2009-04-16T18:42:48.133 に答える
3

最近のプロジェクトでは、アクセス許可を管理するためにいくつかのロール ベースのコントロールを使用する目的で、ASP.NET メンバーシップ プロバイダーを拡張しました (カスタム プロバイダーを作成しました)。プロジェクトが十分に成熟した今、私たちは、コントロールが私たちの要件に対して十分に柔軟ではないことを発見しており、MS メンバーシップの道をたどることをある程度後悔しています. 適切に設計する時間があれば、独自の認証を導入するのが最善の選択肢です。

あなたのアプリは、内部と外部の顧客にサービスを提供しているという点で少しハイブリッドのように思えますが、外部の顧客のためにOpenIDを統合することも検討してください。外部顧客の新しいアカウントの処理を非常に簡単にする優れた ASP.NET OpenID コントロールがいくつかあります。もちろん、これはアプリケーションがどの程度「公開」されているかによって異なります。

于 2009-04-16T20:41:38.457 に答える
1

LDAP誰か?無料で、クロスプラットフォームで、リモートでの使用と管理が簡単で、他の認証スキームへのブリッジがあり、存在を知っていたより多くの言語でのバインドが可能です...

于 2009-04-16T18:38:44.023 に答える
1

AZMan は 2003 年からですか?

1 または 3 をお勧めします。個人的には、常に 3 を使用しています。1 には、使用しない、または使用する気にならない機能がたくさんあります。

于 2009-04-16T18:44:05.243 に答える
1

私はアズマンから離れます。私たちは一度その道をたどり、私たちが壊れた町のセクションが好きではありませんでした.私たちは常に、現在のユーザーのSIDを使用してデータベース内のユーザーにリンクし、権限を取得するADベースのログインを行ってきました.そこから。あなたのセットアップを考えると、これは不可能 (または実用的) ではないかもしれませんが、いずれにせよ、私は AzMan には近づきません。

于 2009-04-16T18:46:15.707 に答える
1

私は ASP や .NET の開発者ではありませんが、(3) と直感的に言います。公用の Web アプリから企業ネットワークへの何らかのアクセスを許可したくはありません。

于 2009-04-16T18:58:33.697 に答える
1

1 つの技術ソリューションに固執するには、あまりにも多くの機能と拡張性を提供しているようです

解決策 3。

アプリケーション全体を User クラスに基づいて作成します。必要な柔軟性と拡張性を提供できるように、モデル化するだけで済みます。

何かのようなもの:

    [ClassAttribute ( "Yordan Georgiev", "1.0.2", "20090302", "20090415" , false )]
public class User
{
    #region DomainName
    private string _DomainName;
    public string DomainName
    {
        get { return _DomainName; }
        set { _DomainName = value; }
    } //eof property DomainName 


    #endregion DomainName

    #region Status
    private int _Status;
    public int Status
    {
        get { return _Status; }
        set { _Status = value; }
    } //eof property Status 


    #endregion Status

#region Password
    private string _Password = Resources.GV.Pass; 
    public string Password
    {
        get { return _Password; }
        set {
            _Password = GenApp.Utils.Security.Encryptor.Encrypt ( value,
                GenApp.Conf.GenAppSettings.Instance.EncryptionAlgorithm );
            //debug_Password = value; //unencrypted 
        }
    } //eof property Password 


    #endregion Password 

#region ListUserRoles
        private List<UserRole> _ListUserRoles;
        public List<UserRole> ListUserRoles { get { return _ListUserRoles; } set     { _ListUserRoles = value; } }
        #endregion ListUserRoles


    #region UserSettings
    private GenApp.Conf.UserSettings _UserSettings;
    public GenApp.Conf.UserSettings UserSettings
    {
        get {
            if (_UserSettings == null)
                _UserSettings = (GenApp.Conf.UserSettings)GenApp.Conf.GenAppSettings.Instance;

            return _UserSettings; 
        }
        set { _UserSettings = value; }
    } //eof property UserSettings 

}

于 2009-04-16T19:01:19.477 に答える