2011-11-23 15 views
15

ASP.NET MVCアプリケーションの個々のレコードのセキュリティ(取得および変更)を処理するすべての人は何ですか?このアプリケーションには、Webユーザーインターフェイスとは完全に別個のサービス/ビジネスレイヤーとデータアクセスレイヤーがあります。私は既にメンバーシップとロールのプロバイダを使用してアプリケーションの特定の領域や機能に対する認証と承認を処理していますが、今は個別のレコードを保護する必要があります。ASP.NET MVCアプリケーションでレコード/エンティティレベルのセキュリティを処理する

たとえば、Bobが自分のFooBarレコードを作成および編集できるとします。他のユーザーがBobのレコードを表示または編集できないようにしたい。私は、URLの操作やプログラミングミスを防ぎたい。また、Bobが他のユーザーとFooBarsを共有できるようにして、自分のレコードを表示することはできますが編集することはできません。

  • を直接検索し、修正クエリで、データアクセス層でセキュリティチェックを行います。

    は、私が出ているいくつかのアプローチがあります。

  • ビジネスロジックを進める前に、追加のセキュリティクエリを実行して、サービスレイヤのセキュリティをチェックしてください。
  • UIとサービスレイヤの間に存在するセキュリティレイヤを作成します。 UIは、すべての要求をSecurityレイヤーを通して行います。
  • アスペクト指向プログラミング(AOP)を使用します。セキュリティアスペクトを作成し、セキュリティ属性を使用してサービスレイヤメソッドを修飾します。

以前のプロジェクトのデータアクセスレイヤー(クエリ内)でセキュリティを行いましたが、それはいつも混乱になります。私は他の人たちが何をしているのか、そしてあなたを助けるために使っているフレームワーク(AOPフレームワーク)をお知りになりたいと思います。

答えて

2

私はいつも第2アプローチか第3アプローチかを取っています。ロジックハン​​ドラ。

AOPはコードを完全に制御できないように聞こえ、DALのセキュリティはさまざまな責任を混同しているような誤ったアプローチのように聞こえます。

2

どこにでも置くロジックが問題かもしれないと思います。私は同じような状況を抱えている。私がどのようにそれを扱っているか説明しましょう。

public class FooBarController : Controller 
{ 

    //this is easy as compared to edit 
    [Authorized] 
    public ActionResult Create() 
    { 


    } 


    [AjaxAuthorize(Roles = "Administrator")]  
    public ActionResult Edit(int id) 
    { 


    } 
} 

public class AjaxAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 


     var id = filterContext.RouteData.Values["id"]; 
     // Here you can check if the id belongs to logged in user 
     var content = SomeRepository.GetById(id); 
     if (contet.OwnerId=LoggedInUser.Id) 
      return; 

     //otherwise check if logged in user is from some Admin or other role. 


     string redirectPage = "/account/logon"; 
     var roles = base.Roles.Trim().Split(','); 
     bool CanAccess = false; 

     //If no role is there 
     if (base.Roles.Equals(string.Empty) || roles.Count() == 0) 
     { 
      CanAccess = true; 
     } 
     else 
     { 
      foreach (var item in roles) 
      { 
       CanAccess = filterContext.HttpContext.User.IsInRole(item); 
       if (CanAccess) 
        break; 
      } 
     } 

     var request = filterContext.RequestContext.HttpContext.Request; 
     if (request.IsAjaxRequest()) 
     { 
      if (!(request.IsAuthenticated && CanAccess)) 
      { 
       filterContext.Result = new AjaxAwareRedirectResult(redirectPage); 
       return; 
      } 
     } 

     base.OnAuthorization(filterContext); 
    } 
} 

public class AjaxAwareRedirectResult : RedirectResult 
{ 
    public AjaxAwareRedirectResult(string url) 
     : base(url) 
    { 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context.RequestContext.HttpContext.Request.IsAjaxRequest()) 
     { 

      string destinationUrl = UrlHelper.GenerateContentUrl(Url, context.HttpContext); 

      JavaScriptResult result = new JavaScriptResult() 
      { 
       Script = "window.location='" + destinationUrl + "';" 
      }; 
      result.ExecuteResult(context); 
     } 
     else 
      base.ExecuteResult(context); 
    } 
} 

これで、オーナーまたは管理者がコンテンツの編集を許可できます。この属性はAjaxRequestも処理するため、この属性をAjaxとして呼び出しています。 私はこれが役立つことを願っています。上記アプローチで

よろしく

Parinder

0
public class Entity 
{ 
    public Right[] Rights { get; set; }   
} 

public class Right 
{ 
    public User user {get;set;} 
    public Permission[] permissions {get;set;} 

} 

public class Foo : Entity 
{ 


} 

public class Bar : Entity 
{ 

} 

特定のユーザがそのエンティティの上に持っている権利を格納する基本クラスエンティティが存在します。 Entityクラスから保護するすべてのクラスを継承します。

関連する問題