コントローラの多くの動作に再現される次のコードブロックを考えてみましょう。 (私は主にメソッド本体の最初の6行に関係しています)。ASP.NET MVC - オプションでベースクラスメソッドからリダイレクトしますか?
[HttpGet]
public ActionResult OptOut()
{
var user = this.SecurityPrincipal;
if (user.IsReadOnlyUser)
{
this.TempData["ViewModel"] = new AuthorizationModel { User = user };
return this.RedirectToAction("NotAuthorized", "Authorization");
}
var model = /* Elided for brevity */
return this.View(model);
}
私のコントローラは、今度は、Controller
から派生基本クラスから派生SecuredController
。 SecurityPrincipal
は、SecuredController
のプロパティであり、現在のユーザーに関する広範なActive Directoryデータを含んでいます。
重複したコードを削除するために、if {...}
ブロックに含まれる機能を基本クラスのメソッドに移動するのが理想的ですが、これを行う方法は考えられません。この方法は、このような不格好なもので、その結果、ActionResult
でなければならないであろう。
if ((var result = this.RequireReadWrite()) != null)
{
return result;
}
誰もがこれを行う方法を提案、または私はここで、単純に運が悪いだことはできますか?
[MVCアクションフィルタ](http://www.asp.net/mvc/overview/older-versions-1/controllers-and-routing/)についてはどうすればよいですか?理解 - 行動 - フィルター - CS)?あなたのデザインでそれを考えましたか? 'ActionResult'の内容に' filterContext'を追加することでより多くの制御ができます。 – QuantumHive
Aフィルター音が適切です。 – Shyju
一般に、あなたのメソッドでセキュリティを行っているなら、それは間違っています。セキュリティはクロスカッティングの問題であり、メソッドを実行する前に処理する必要があります。前述したように、これを処理するにはフィルターが適していますが、MVCにはフレームワーク全体があります。自分のセキュリティをロールしようとしていますが、それはほとんど常にアンチパターンです。本質的に、あなたはあなたの家に高価で十分にテストされたセキュリティシステムを持っており、ドアを開けずに退屈な10代の人に家が安全であることを確認するように求めています。 –