1

現在、データベースの権限を取得できるように、[承認]フィルタの拡張機能を使用しています。すべてが機能しますが、パフォーマンスの問題は確実です。私はデータベースにクエリを送り、許可を求めるたびに、これを判断する最良の方法ではありません。だから私はこれらのデータをセッションに入れることを考えました。データベースからのデータを、セッションオブジェクト(LINQ)とデータベースの中に入れる最も速い方法は何ですか?データベースからのデータをMVCのセッションに入れます

は今、これは次のようになります。

var _allowedRolesDB = context.sec_RolesInCAs 
       .Where(rl => rl.MenuControlName == controllRights && rl.MenuActionName == actionRights) 
       .Select(rl => rl.RoleName); 

      foreach (var r in _allowedRolesDB) 
      { 
       RolesDB = RolesDB + r.ToString() + ","; 
      } 

が、私はMySuperSessionSomethinkがデータベースから一回取得したデータを保持します

var _allowedRolesDB = MySuperSessionSomethink 
.Where(rl => rl.MenuControlName == controllRights && rl.MenuActionName == actionRights) 
       .Select(rl => rl.RoleName); 

      foreach (var r in _allowedRolesDB) 
      { 
       RolesDB = RolesDB + r.ToString() + ","; 
      } 

に変更します。どのように私はこれを行うことができます任意のアイデア? Txのヘルプ。


BIGGER PICTURE

[OK]をクリックします。私はより大きな画像を表示します。 全体のアイデアは、カスタム認証フィルタを作成することです。

[CustomAuthAttribute("Home,Index", Roles = "SuperAdministrator")] 
    public ActionResult Index() 
    { 
     ViewBag.Message = "Welcome to ASP.NET MVC!"; 

     return View(); 
    } 

これの目標は何ですか。すべての利点と、データベースの権利に関する情報を保持するなどの追加機能を備えたauthorize属性を作成します。

今、私は何をすべきかは、次のとおりです。

public CustomAuthAttribute(params string[] controllerAction) 
{ 
     IPrincipal user = HttpContext.Current.User; 
     string userName = user.Identity.Name; 
     **... some code .. and take all allowed roles and check it have permissions** 
     var _allowedRolesDB = context.sec_RolesInCAs 
      .Where(rl => rl.MenuControlName == controllRights && rl.MenuActionName == actionRights) 
      .Select(rl => rl.RoleName); 

     foreach (var r in _allowedRolesDB) 
     { 
      RolesDB = RolesDB + r.ToString() + ","; 
     } 
     **... some code .. thesame withs single users** 

} 

この後、私は

protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    **... can acces or not part of code ...** 
    if (_rolesSplit.Any(user.IsInRole)) 
    { 
     return true; 
    } 
} 

を使用しますが、問題があります。毎回私はデータベースに許可について尋ねるが、このIMHOは最良の方法ではない。今私のアイデアは1人のユーザーのためのすべてのアクセス権を取って、彼がハイになったときに彼のセッションに入れます。たぶん私は間違っているこの方法は、問題を作るだろうが、データベースに保管し、権限についてのすべての時間を尋ねるも良いアイデアではない:)。データを1つまたは2つの質問の後でデータベースに取り込み、コードに使用する方が良いでしょうか?

答えて

0

まず、セッションではなくキャッシュに追加したいと思うようです。彼らはアプリケーションにとってグローバルであるように見えますが、ユーザー固有のものではありません。メニューコントロール/作用による役割の検索をやっているので、私は、ルックアップとして、それらをキャッシュに追加します。

string action = controlRights + actionRights; 
string allowedRoles = Cache[action]; 
if (allowedRoles == null) 
{ 
    allowedRoles = String.Join(",", context.sec_RolesInCAs 
     .Where(rl => rl.MenuControlName == controlRights && rl.MenuActionName == actionRights) 
     .Select(rl => rl.RoleName) 
     .ToArray()); 
    Cache[action] = allowedRoles; 
} 

これはから、与えられた制御/アクションのためにあなたに許可されたロールを与えます2番目の要求でキャッシュします。

+1

完璧に動作するようです。 –

関連する問題