2017-02-20 3 views
1

私は一部のユーザーがロールになる可能性があるプロジェクトに取り組んでいますAdminReader。これらのユーザーはすべてを見ることができますが、データを保存/編集することはできません。アクションを実行する前にユーザーロールを確認する方法はありますか?

私はそれをこの方法で行うことができます知っている:

public JsonResult ChangeStatus(int? id) 
{ 
    // AdminReader validation 
    if (base.User.isAdminReader) 
    { 
     return Json(new 
     { 
      Message = "You don't have privileges to alter data.", 
      Success = false, 
     }, JsonRequestBehavior.AllowGet); 
    } 

    // Function code 

しかし、私はすべてのプロジェクトの関数の内部で上記のコードを挿入する必要はありません。

[HttpGet]のように私のメソッドを飾ることができると思っていました。私もこれを読んだSO post

その後、私はその考えを落としました。

しかし、私は例外ハンドラ属性とロギングアクションフィルタについて発見しました。

何とかpublic void OnActionExecuting(ActionExecutingContext filterContext)と私のAdminReader検証を組み合わせることはできますか?

私の問題について正しい方法であるかどうかはわかりません。また、本当にうまくいくかどうかはわかりません。この状況では何がベストプラクティスですか?

どのような提案もありがとうございます。

+0

コントローラ全体を1つの役割でしかアクセスできないように制限しますか? @BillRuhl。 – BillRuhl

+0

各行のステータスを変更するためのボタンが付いたテーブルリストを考えてみましょう(これは私の例です)。'AdminReader'はテーブルリスト(コントローラ内の' PartialViewResult')を見ることができますが、 'ChangeStatus'(同じコントローラ内の' JsonResult')はできません。ほとんどのコントローラに適用されます。ステータスを変更するボタンがあるリスト、値を編集するボタンがあるモーダルです。ビューはアクセス可能ですが、メソッドは –

+2

ではありません。@if(User.Identity.IsAuthenticated &&!User.IsInRole( "AdminReader")){// render button} 。つまり、ユーザの役割が "AdiminReader"であれば、ボタンをレンダリングしないでください。 – BillRuhl

答えて

0

これを行う方法はたくさんあります。

はい、属性はメタデータだけです。ただし、MVCフレームワークには、特定のメタデータを認識してアクションを実行するコードが含まれています。例には、あなたが言及した2つの属性(ActionFiltersとExceptionFilters)が含まれています。また、あなたが実際に望むものかもしれないAuthorizationFiltersもあります。

AuthorizationFiltersはMVCパイプラインの開始付近でActionFiltersの前で実行されるため、ページが実際にレンダリングされる前にアクセスをブロックできます。しかし、必要がない場合は、この点を使ってページをレンダリングする前に特定のことを行うことができます。

しかし、それでも、各ページには、その役割に基づいてユーザーが実行できる操作と実行できない操作を制御するコードが必要です。その周りに魔法の方法はありません。アクセスに基づいてページ上でユーザーが実行できる操作を制御したい場合は、制御が必要な各セクションでその操作を行うコードが必要です。

ページからの戻り値は通常はレンダリングするHTMLですが、何らかのステータスメッセージを返すように見えるので、実行しようとしていることはあなたの例では分かりません。ページ自体がレンダリングする必要があるので、どのようにすべてのページにそれを複製できるか分かりません。

+0

'AdminReader'はビュー、パーシャル、テーブルリスト、モーダル、すべてにアクセスできますが、 ChangeStatus'(私の質問の例のように)。 –

0

これがオフになっている場合、私は、とても残念私はあなたの質問を理解し、完全にはよく分からない。しかし、あなたはあなたのAdminReaderロジックを実行したい場合は、以下のような独自のカスタム属性を書くことができます:

public class AccessDeniedAuthorizeAttribute : AuthorizeAttribute 
{ 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      base.OnAuthorization(filterContext); 
      if (filterContext.Result is HttpUnauthorizedResult) 
      { 
       // Perform your unauthorized action here. 
      } 
     } 
} 

そして、それが適用される任意のメソッドに属性をスローします(または、すべてに適用される場合はControllerクラス全体にスローすることもできます)。同様に:

// The RoleSettings is a class of constants I defined that just contain strings 
[AccessDeniedAuthorize(Roles = RoleSettings.AdminRole] 
[HttpPost] 
public ActionResult MyEditMethod() 
{ 
    // Perform actions if they are in the AdminRole 
    // If not authorized, it will do whatever you defined above in the 
    // AccessDeniedAuthorizeAttribute 
} 
関連する問題