2016-10-19 5 views
2

Authorize-Attributeの結果をビューに引き渡す可能性はありますか?ASP.Net MVC認証 - ロールに基づいてビューの要素を隠す

ユーザーのメンバーシップに基づいてインデックスビューで5つのリンクを非表示にしたいとします。

[Authorize(Roles = "Admin")] 
public ActionResult Index(){ 
    .... 
} 

上記のコードは、Admin-Groupに属していないすべてのユーザーがインデックスページにアクセスできないようにします。

このコードは、ユーザーが管理者ロールの一部でない場合はリンクを非表示にします。これは基本的に私が望むものですが、このメソッドを使用すると、ロールが変更されるとすべての隠しリンクでロール名を変更する必要があります。

両方の組み合わせのようなものはありませんか? (スキーマ参照)

[Authorize(Roles = "Admin")] //This will pass true to the View if the User is a member of the group "Admin" 
public ActionResult Index(){ 
    .... 
} 

@{ 
    if(User.IsAuthenticated){ //This will read the "Token" and if it's true the if statement will get executed. 
     <a href="#">Some link to be hidden</a> 
    } 
} 

したがって、ユーザーがロール "管理者"の場合、リンクが表示されます。これは可能ですか?

答えて

2

ViewBagViewDataを使用できますが、リンクを表示するかどうかを示すプロパティを持つビューにモデルを戻すことをお勧めします。

あなたがやるだろう、あなたのコントローラで
public class YourViewModel() 
{ 
    public bool ShowHiddenLinks { get; set; } 
    // ... whatever other properties 
} 

[Authorize(Roles = "Admin")] 
public ActionResult Index() 
{ 
    var yourVm = new YourViewModel(); 
    yourVm.ShowHiddenLinks = true; 

    return View(yourVm); 
} 

そして、あなたのビューは次のようになります。

@model YourViewModel 

/* ShowHiddenLinks is true & this view is meant for admins only, 
    so show admin-related links */ 
@if (Model.ShowHiddenLinks) 
{ 
    <a href="#">Some link to be hidden</a> 
} 

それがなるように、私は、わざとのviewmodelプロパティShowHiddenLinks名付けました他のユーザーのためのビューにも再利用できます。もちろん、ビューモデルを他のロールのフィーチャプロパティに拡張することもできます(たとえば、管理者とモデレータがアクセスできるビュー、それぞれ独自の隠れリンクセットを持つビュー)、またはロールごとに1つのビューモデルを作成します。

+0

したがって、ビュー内のifステートメントとAttributeを接続する可能性はありませんか? – C4p741nZ

+0

ユーザーが "Admin" _ "グループのメンバーである場合、ビューに" true "を渡したいとします。これはまさにビューモデルが行うことで、ビューに戻るためにデータを渡します。 – trashr0x

+0

申し訳ありませんが、その質問は100%明確なものではありませんでした。質問は、ビューで権限ベースの属性をロールベースのリンクに関連付けることでした。確かにVMのアプローチはそれほど悪くはありませんが、ちょうど "ちょっとあなたの行動"と言うことは可能ですが、誰もがあなたにアクセスできますが、一部のコンテンツは "Authorize" - アトリビューション(または類似のもの)で述べた役割に限定する必要があります – C4p741nZ

関連する問題