認証、認可ユーザおよび役割管理および一般担保す。当期純
-
11-07-2019 - |
質問
った場合、リンクからマウスアウめに実施一般セキュリティにC#アプリ。どのような選択肢がないと、この観点か?私の希望は、既存の枠組みの場合では私のニーズにならないようにしたい再発明をするつもりはありま
私の要件は、以下のとおりです:
- 通常のユーザ名/パスワード認証
- 管理ユーザーのassign permissions許可の割り当てるユーザー
- 管理の役割に割り当てユーザーの役割、assign permissions許可の割り当てる役割
- ユーザーの認可に基づくユーザー名と役割
いオープンソースの枠組みで書かれている時間-tesed用されます。純ます。
私の申請からクライアント/サーバーアプローチは、サーバーをwindowsのサービスへの接続SQL Serverデータベースです。通信のクライアントとサーバのメンテナンスを通じて、WCF.
ひとつ重要なことがある者の特定のユーザーまたは役割の権限の閲覧/変更/削除は特定の団体からのお客様は、商品など。用例ジャックである3 10お客様のみ、更新のお客様はMicrosoft、Yahoo!とGoogleでのみ削除するものとし、また、ヤフー
解決
粗粒度の安を感じるかもしれませんが組み込み元コードに有用であること。のユーザオブジェクト(およびその役割)により制御す。インターネット使用に"主体"がusefullyのランタイムも実施できる。
の実施主体で実装で定義されていますが、できる通常の注入をご; 例えば、WCF.
の実行を制粗動アクセス(る 機能 アクセスできるいかなる特定の データ):
static class Roles {
public const string Administrator = "ADMIN";
}
static class Program {
static void Main() {
Thread.CurrentPrincipal = new GenericPrincipal(
new GenericIdentity("Fred"), new string[] { Roles.Administrator });
DeleteDatabase(); // fine
Thread.CurrentPrincipal = new GenericPrincipal(
new GenericIdentity("Barney"), new string[] { });
DeleteDatabase(); // boom
}
[PrincipalPermission(SecurityAction.Demand, Role = Roles.Administrator)]
public static void DeleteDatabase()
{
Console.WriteLine(
Thread.CurrentPrincipal.Identity.Name + " has deleted the database...");
}
}
しかし、これは当てはまりません支援のための細粒度アクセス("フレッドアクセスできるお客さまがお客様B")
追加;もちろん、かつ、きめ細かく、できるだけ確認に必要とされるランタイム時において、確認 IsInRole
の元:
static void EnforceRole(string role)
{
if (string.IsNullOrEmpty(role)) { return; } // assume anon OK
IPrincipal principal = Thread.CurrentPrincipal;
if (principal == null || !principal.IsInRole(role))
{
throw new SecurityException("Access denied to role: " + role);
}
}
public static User GetUser(string id)
{
User user = Repository.GetUser(id);
EnforceRole(user.AccessRole);
return user;
}
お好きにはたまご自身の主体-アイデンティティオブジェクトなぐテスト/キャッシュの役割、というよりもむしろ知べてのフロント:
class CustomPrincipal : IPrincipal, IIdentity
{
private string cn;
public CustomPrincipal(string cn)
{
if (string.IsNullOrEmpty(cn)) throw new ArgumentNullException("cn");
this.cn = cn;
}
// perhaps not ideal, but serves as an example
readonly Dictionary<string, bool> roleCache =
new Dictionary<string, bool>();
public override string ToString() { return cn; }
bool IIdentity.IsAuthenticated { get { return true; } }
string IIdentity.AuthenticationType { get { return "iris scan"; } }
string IIdentity.Name { get { return cn; } }
IIdentity IPrincipal.Identity { get { return this; } }
bool IPrincipal.IsInRole(string role)
{
if (string.IsNullOrEmpty(role)) return true; // assume anon OK
lock (roleCache)
{
bool value;
if (!roleCache.TryGetValue(role, out value)) {
value = RoleHasAccess(cn, role);
roleCache.Add(role, value);
}
return value;
}
}
private static bool RoleHasAccess(string cn, string role)
{
//TODO: talk to your own security store
}
}
他のヒント
ASP.NETのメンバーシッププロバイダーをご覧ください。すぐに使えるSQLMembershipProviderはあなたのケースでは機能しないと思いますが、独自のプロバイダーを展開するのは簡単です。
私の答えは、おそらくこの質問に対する答えに依存しています。 これは、Active Directoryを備えたネットワーク内に存在するエンタープライズアプリケーションですか?
答えが「はい」の場合、これらは私が提供するステップです:
1)アプリケーションのグローバルグループを作成します。私の場合、APPUSERグループとAPPADMINグループがありました。
2)混合認証モードでSQL Serverにアクセスできるようにしてから、DBへの適切なCRUD権限を使用して、APPUSERグループをSQL SERVERログインとしてデータベースに割り当て、接続文字列で Trusted Connection = True でSQL SERVERにアクセスすること。
この時点で、ADストアが認証を担当します。 TRUSTED CONNECTIONを介してアプリケーションにアクセスしているため、アプリケーションを実行しているアカウントのIDをSQL Serverに渡します。
今、AUTHORIZATION(つまり、ログインしているユーザーに許可されていることをアプリケーションに伝える)の場合、ログインしているユーザーがメンバーになっているグループのリストをADに照会するだけです。次に、適切なグループ名を確認し、この方法でメンバーシップに基づいてUIを構築します。
アプリケーションの動作方法は次のとおりです。
- アプリケーションを起動すると、資格情報はログインしたユーザーに基づきます。これが認証の主要な側面です(つまり、ログインできるため存在します)
- 問題のWindows IDのすべてのグループを取得
- 標準のUSERグループを確認します-問題のWindows IDにこのグループが存在しない場合、認証は失敗です
- ADMINユーザーグループを確認します-これがユーザーのグループに存在するため、UIを変更して管理コンポーネントへのアクセスを許可します
- UIを表示
次に、決定された権限などを持つPRINCIPLEオブジェクトを持っているか、フォームを構築するときにアクセスできるGLOBAL変数を使用して適切なUIを決定します(つまり、ユーザーがADMINグループのメンバーでない場合) 、すべてのDELETEボタンを非表示にします)。
なぜこれを提案するのですか?
これは展開の問題です。
ほとんどのエンタープライズアプリケーションは、プログラマではなくネットワークエンジニアによって展開されています。したがって、認証/承認はADの責任であることが理にかなっています。認可。
さらに、ネットワークの新しいユーザーの作成中に、ネットワークエンジニア(または新しいネットワークユーザーの作成を担当する人)は、彼らがしなければならないという事実よりも、ADにいる間にグループ割り当てを実行することを覚えている傾向があります多数のアプリケーションを使用して、承認の割り当てを解析します。
これを行うと、新規雇用を許可する必要がある、または退職する必要がある許可と権利の迷路に役立ち、所属する中央リポジトリ(つまり、AD @ Domain Controller)で認証と承認を維持しますレベル)。
CSLA.netのようなものを見ます: a
必要なすべてを提供する必要があります。
WCFには、承認と認証の両方を提供する豊富なセキュリティ関連機能があります。 詳細はこちら: http://msdn.microsoft.com/en-us/library/ms735093。 aspx
ここでいくつかの個別の問題を検討していると思います。ほとんどのセキュリティシステムが認証と承認を個別に行うことは偶然ではありません。
認証については、より大きな質問はロジスティックです。または、これらのユーザーが住んでいる論理的な場所がありますか?それは、アプリケーションのローカル、Active Directory、他のLDAPストア、または他のアプリケーションですらあります。まったく重要ではない正確な場所です。ユーザーを確実に識別し、できればそのタスクを他の誰かの問題にすることができればよいのです。一日の終わりには、一意の識別子と、経理部門のボブが経理部門のボブであるという安心感が本当に必要なだけです。
ここで問題となっているのは、認可です。本当にきめ細かい場合は、ユーザーがどこから来たとしても、アプリケーション内で完全に管理したいと思うでしょう。 Marc Gravellは、少なくともこれのいくつかをモデル化する良い方法に本当にヒットしました。IPrincipalとPrincipalPermissionのカスタム実装を使用して、物事を管理することは非常にクリーンな開始方法です。さらに、 this のようなテクニックを使用できます。 >より複雑な認可決定をかなり簡潔に行うため。
すべての要件の解決策として、「RBAC」(ロールベースのアクセス制御システム)という用語を使用します。
ここでは「RBAC」について詳しく説明しませんが、次のように簡単に説明します。
基本的に3つの機能が含まれています。
1)認証-ユーザーの身元を確認します。通常、ユーザーアカウントとパスワードまたは資格情報を介して行われます。
2)承認-ユーザーがアプリケーションでできることとできないことを定義します。例「注文の変更」は許可されていますが、「新しい注文の作成」は許可されていません。
3)アプリケーションでのユーザーアクションの監査。 -アプリケーションでのユーザーのアクション、および誰がどのユーザーにどのアクセスを許可したかを追跡しますか?
WikiでRBACを確認できます。
https://en.wikipedia.org/wiki/Role-based_access_control
今、あなたの要件への答えに関して-可能な解決策の1つは、ニーズに応じてASP.NETメンバーシップを拡張することです。
また、一部のフレームワークを使用する準備については、 VisualGuard 私が仕事をしているので、これをチェックする必要があります。必要なことはすべて簡単に行います。最も重要なことは、すべてのユーザー、ロール、権限、アプリケーションを中央管理コンソールで管理し、権限を定義することです。 、管理者は開発者の知識を必要としません。つまり、管理者はUIを介してアクティビティの制限を作成できます。
この記事をチェックして、権限と役割ベースのシステムについて理解を深めることもできます。