0

ASP.NET/MVC を使用しており、ActionResult/ViewResult コントローラー メソッドにセキュリティ対策を追加する必要があります。基本的に、ユーザーがページに関連付けられているのと同じ組織に関連付けられていること、ユーザーのアクセスレベルを確認し、必要に応じてリダイレクトする必要があります。

通常、これには属性を使用しますが、ビュー/リダイレクトを返す場所を決定するためにいくつかのビジネス ロジックを使用する必要があり、それを実行する前にクエリ文字列値で非定数ユーザー定義オブジェクトを初期化する必要があります。おそらくヘルパークラスを使用してロジックを集中化したいのですが(提案を受け付けています)、コンテキストにアクセスする方法やヘルパークラスからリダイレクトする方法がわかりません。

たとえば、ページアクションは次のようになります...

public ActionResult Index(string id)
{
            Models.Bucket bucket = new Bucket();
            InitBucket(bucket, id);

            SecurityHelper.UserOrganisationMatchesObjectOrganisation(CurrentUser, bucket);
}

そしてSecurityHelperで

    public static void UserOrganisationMatchesObjectOrganisation(Model.User user, Bucket bucket)
    {
       //if various logic in user and bucket occur return View("NewPage", bucket)

       //else return RedirectResult("~/yournotallowed")
    }

唯一のことは、ヘルパーメソッドでコンテキストなしでビューをリダイレクト/返すことができず、コントローラーからヘルパークラスに渡す方法、またはそれが可能かどうかがわからないことです。

サービスを使用したり、属性を使用して初期化されたバケットオブジェクトを渡すことができるなど、これを行うためのより良い方法があると確信しています.

どんな提案でも大歓迎です!

ありがとう

4

1 に答える 1

1

ここで何かが欠けているかもしれませんが、メソッドActionResultからを返すだけの場合ではありませんか? UserOrganisationMatchesObjectOrganisationメソッドが何をしようとしているのかがもう少し明白になるように、おそらく名前を変更します。

public static class Security
{
    public static ActionResult GetActionResultForUser(Model.User user, Bucket bucket)
    {
        //if various logic in user and bucket occur return View("NewPage", bucket)
        //else return RedirectResult("~/yournotallowed")    
    }   
}

...
public ActionResult Index(string id)
{
    Models.Bucket bucket = new Bucket();
    InitBucket(bucket, id);
    return Security.GetActionResultForUser(CurrentUser, bucket);
}

別のアプローチは、Service何らかの状態を返す (または例外をスローする) ことができるクラスを導入することです。これを使用して、返すビューを決定できます。

private BucketService _bucketService = new BucketService();
...

public ActionResult Index(string id)
{
    try
    {
        var bucket = _bucketService.GetBucketForUser(CurrentUser, id);
        return View("NewPage", bucket);
    }
    catch (InsufficientPriviledgesException)
    {
        return RedirectResult("~/yournotallowed");
    }
}

このアプローチの利点は、ビジネス ロジックとプレゼンテーション ロジックを明確に分離できることです。

于 2012-12-13T12:52:46.017 に答える