ASP.NET Coreでランタイム認証を設定するにはどうすればよいですか?


8

私はロールベースのモジュール管理があり、いつでもいつでも変更されるという点でアプリケーションを作成しています。シナリオ:

  • ユーザーが従業員を作成および表示するアクセス権を持っている場合、ユーザーは従業員を作成および表示することしかできませんが、将来の管理者はユーザーの役割を作成および表示から表示および削除に変更し、ユーザーはそのアクティビティのみを実行できます。

私は試し[Authorize(Roles ="Staff")]ますが、管理者がランタイムを変更した場合、それが管理されていません。

誰かがこれを調べて私に連絡してもらえますか?


Authorize(Roles ="Staff")ロールを持つユーザーStaffのみがこのアクションにアクセスできることを確認します...したがって、ユーザーがこのロールから削除されると、ユーザーはこれにアクセスできなくなります。これは発生していませんか?
Chetan Ranpariya

私の知る限り、これは不可能であり、おそらく良い考えではありません。新しいロールを適用するには、ユーザーはログアウトしてから再度ログインする必要があります。ページを別の方法でレンダリングすることもできます。
Emad

Cookieまたはjwtベアラートークンを使用していると想定します。ユーザーのクレーム/ロールはCookie /トークンに保持されているため、ユーザーをログアウトして再度サインインし、新しいCookie /トークンを取得する必要があります。
itminus

こんにちは、@ itminus現在、初期段階が実行されているため、ログイン時にユーザーがのような役割と使用可能な役割のリストを取得し、@ EmadはいCreate EmployeeView Employeeライブセッション中に変更がある場合は、ログイン時に変更が必要です。役割に影響を与えます。出来ますか?
Deep Soni、

@DeepSoniでカスタムのAuthorize属性を実装できるため、この要件を達成できます。先に進むことができるように提案してください。
jishan siddique

回答:


1

これは複雑な質問であり、正しい答えはありませんが、それを行うにはいくつかの方法があります。最初に、要求ベースのjwtを使用してステートレス認証を使用していると仮定します。最も簡単な方法は、すべてのリクエストの前にユーザーロールを読み取る独自のポリシーを作成することです。

internal class DatabaseRoles : IAuthorizationRequirement
    {
        public string Role { get; }

        public DatabaseRoles(string role)
        {
            Role = role;
        }
    }

    internal class DatabaseRolesHandler : AuthorizationHandler<DatabaseRoles>
    {
        private readonly UserManager<IdentityUser> userManager;

        public DatabaseRolesHandler(UserManager<IdentityUser> userManager, RoleManager<IdentityRole> roleManager)
        {
            this.userManager = userManager;
        }

        protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, DatabaseRoles requirement)
        {
            //NOTE this is the out of the box implementation of roles and simple query to get the roles from the EF backed database. I would recoment makeing a custom privelages store for this and not using roles for this but access rights
            var user = await userManager.FindByIdAsync(userManager.GetUserId(context.User));
            if (await userManager.IsInRoleAsync(user, requirement.Role))
            {
                context.Succeed(requirement);
            }
        }

    }

しかし、このソリューションは要求ごとにデータベースへの呼び出しを必要とするため、それほど高性能ではありません。これは負荷が小さい場合は問題ありませんが、トラフィックに問題が発生する可能性があります。もう1つの方法は、役割が変更されたときにすべてのユーザートークンを取り消すことですが、これは非常に複雑です。redisのようなロール用の高速アクセスストアを作成すると、すべての呼び出しでチェックを行う問題は発生しません。また、独自のユーザーストレージを作成することはお勧めしません。セキュリティ基準に関して最新の状態を維持し、維持することは悪夢だからです。


こんにちは、お返事ありがとうございます。私はあなたの解決策を試しましたが、インデックス、作成、編集、またはその他の操作のすべての処理で、このメソッドが呼び出しており、1つの問題は、ダッシュボードがある場合、パブリックが利用可能であり、その特定のモジュールに与えられたロールがない場合、それはありませんあなたのコードに従って誰にでも見える。
Deep Soni、

@DeepSoniデモでそのまま使用することが推奨されない場合にコードを指摘するのは1つだけです。必要に応じてこれをカスタマイズする必要があります。このポイントは、リソースベースの認証の例です。クエリは、カスタムクエリを使用して、ユーザーIDでデータベースをチェックする必要があります。
Filip Cordas

返信いただきありがとうございます。あなたの参照と解決策を試してみましょう。
Deep Soni、

現在、リソースベースの承認のためにMicrosoft Docを参照するIDocumentRepositoryと、使用できなくなります。UmbracoCMSをインストールするように表示されます。分かりますか?
Deep Soni、

おお、それはUmbracoCMS固有の質問です。UmbracoCMSのタグとコードを追加して、それを調べた経験のある人が追加することは、あまりよく知らないので、あまり慣れていません。しかし、私が言えることから、UmbracoCMSに正しいクエリを実行する限り、どこでも機能するはずです。
Filip Cordas

-1

ログインしたユーザーの詳細を保存するためにセッション/ Cookieを使用している場合、管理者がロールを変更するたびに詳細を空にすることができます。すべてのアクションで、セッション/ Cookieの役割を確認して先に進むことができます。ここで、ユーザーがコントローラーを押す画面上の任意の場所をクリックするとすぐに。条件がチェックされ、Session / Cookieオブジェクトが空であるため、ユーザーはログアウトされます。


こんにちは@BansariSoni。答えてくれてありがとう。毎回セッションを削除してユーザーにログインを要求するのは意味がありません。これは、アプリケーションのパッチ(修正済み)にのみ似ているため、許容できる適切な回答や、回答を理解するためのヒントが必要です。
Deep Soni、

ロールがセッションにある場合、私によると、セッション変数を変更するか削除するかの2つのオプションしかありません。ここでは、管理者が役割を変更するときに、セッションにフラグを設定するよりも、そのユーザーIDがセッションに存在するかどうかを確認できるようにすることもできます。次に、この特定のフラグがtrueの場合にのみ、5分ごとにページを更新するcronジョブを作成できます。
Bansari Soni、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.