2011-10-20 8 views
11

私はいくつかの異なる役割があります:管理者、一般ユーザーなど、などセキュリティ私のMVCアプリケーションで

私は承認属性を経由して私のコントローラにセキュリティを適用することができることを知っている:

[Authorize(Roles="Admin")] 
public ActionResult Create() 
{ 
    return View(); 
} 

しかし、私はまた、特定の役割にビューの特定のセクションを表示しないようにビューにいくつかのセキュリティを適用する必要があります。

@if(User.IsInRole("Admin")) 
{ 
    @Html.ActionLink("Create", "Create") 
} 

が、それはそれを上記の方法を行う、またはsecuriのこの種を処理するために、より良いですViewModel内のty:

public ActionResult Index() 
{ 
    var model = new IndexViewModel(); 

    model.CanCreate = User.IsInRole("Admin"); 

    return View(model); 
} 

View: 
@(Model.CanCreate) 
{ 
    @Html.ActionLink("Create", "Create") 
} 

2番目の方法は、最初の方法と比較して利点がありますか?あなたは一人で第二1が安全ではないことを...

注両方が必要になる場合があり

+0

:あなたのアクションメソッドのように飾るだろう

public class DisplayIfAuthorizedAttribute : System.Web.Mvc.AuthorizeAttribute { private string _ViewNameIfNotAuthorized; public DisplayIfAuthorizedAttribute(string viewNameIfNotAuthorized = null) { _ViewNameIfNotAuthorized = viewNameIfNotAuthorized; } public override void OnAuthorization(AuthorizationContext filterContext) { bool isAuthorized = base.AuthorizeCore(filterContext.HttpContext); if (!isAuthorized) { filterContext.Result = GetFailedResult(); } } private ActionResult GetFailedResult() { if (!String.IsNullOrEmpty(_ViewNameIfNotAuthorized)) { return new ViewResult { ViewName = _ViewNameIfNotAuthorized }; } else return new EmptyResult(); } } 

これは、フィルタがどのように見えるかです。 – Birey

答えて

6

ビジネスロジックがモデルレベルにとどまるので、第2の方法がより好ましいです。

例では、ビジネスロジックは非常に簡単です。しかし、要件が変更されたことを想像して、今では管理者だけでなく、1か月以上前に登録した一般ユーザーもコンテンツを作成できます。ビジネスロジックを見て、すべてのビューを更新する必要があります。

1

、ユーザーがアドレスバーのブラウザでActionLinkのためにURLを構築することができるかもしれません。したがって、セキュリティのためには絶対に属性が必要です。

もう1つは、使いやすさやUI設計の問題です。ユーザーが[作成]をクリックして別の方法でログインすることができるようにしたいと思うかもしれません。

+0

私は、アクションに[Authorize]を設定しないという意味ではありませんでした。質問は、モデルにプロパティを含めるか、User.IsInRole()呼び出しを直接ビューに配置することで、Viewセキュリティを処理する必要があります。 – Dismissile

0

コントローラで権限を確認し、役割のルールに従ってビューのViewModelを準備します。

これらのビューは、単にデータを表示するために使用されます。だから、私は、彼らは役割のチェックなどを行う必要はありません。

それは必要なデータをViewModelを準備し、ビューはそれをレンダリングするようにします。

3

これまで私がこれまで行ってきた方法の1つは、AuthorizeAttributeを継承するアクションフィルタを作成することでした。フィルタは、DisplayIfAuthorizedAttributeのように呼び出すことができ、標準のAuthorizeAttributeプロパティに加えて、ViewNameIfNotAuthorizedというプロパティがあります。

属性は、ベースメソッドを呼び出して認証を行い、失敗した場合はViewNameIfNotAuthorizedビューを返します。それ以外の場合は、アクションメソッドを正常に進めることができます。

次に、これらの部分ビューをアクションメソッドでレンダリングし、親ビューでHtml.RenderActionまたはHtml.Actionを通じてアクションメソッドを呼び出します。これらのアクションメソッドは属性で修飾されます。

これを行うための標準化された方法があり、アクションコードの内部を汚染する認証コードはありません。私は最初の方法が良いと思い

[DisplayIfAuthorized("EmptyView", Roles="Admin")] 
     public ViewResult CreateLink() 
     { 
      return View("CreateLink"); 
     } 
関連する問題