2016-08-12 68 views
4

ASP.NET CoreおよびEntity Framework 7(Core)を使用した行レベルセキュリティを使用して、マルチテナントアプリケーションを作成しています。 私のデータベースはMicrosoft SQL Server上でホストされているので、thisメソッドを使用してRLSを実施しました。SESSION_CONTEXTを使用したEntity Frameworkのコア行レベルのセキュリティ

私が必要とするのは、SESSION_CONTEXTに希望のtenant_idを設定することだけです。

私が直面した最初の問題は、EF7を使用してストアドプロシージャを実行することでした。

var resp = context.Set<SessionVars>().FromSql(
      "EXECUTE sp_set_session_context @key = N'my_tenant', @value = {0}; 
      SELECT * FROM mySessionVars", desiredTenant).ToList(); 

私はSESSION_CONTEXTが正常に設定されていることをはっきりと見ることができます上記のコマンドを使用:解決策があると思われます。今度は、同じコンテキスト上の次のクエリが、SESSION_CONTEXTで設定したテナントに従ってフィルタリングされることが期待されます。

int visibleRows = context.MyModel.ToList().Count; 

残念なことに、結果は期待どおりではありません。 SESSION_CONTEXTが設定される前に行が検索されたように動作します。

これはEF7のEager Loadingによるものですか?キャッシュされたデータを使用しているIS EF7ですか? どうすればこの問題を解決できますか?

私はSESSION_CONTEXTに必要な値を設定することができますが、変更するまで、または接続が閉じられるまで、コンテキスト内で保持されることを期待しています。

+0

ブログのカップルは、それが役に立つかどう異なるアプローチ、http://craigpickles.com/row-level-security-in-azure-sql-with-entity-framework/がわからない示しています。私は共有すると思った。 –

+0

Entity Framework Core 2.0以降、グローバルクエリフィルタは、データベースを使用する代わりに、行レベルのセキュリティを改善するソリューションです。 http://gunnarpeipman.com/2017/08/ef-core-global-query-filters/ –

答えて

4

私はEF6と我々が呼び出し コードが context.Database.Connectionを呼び出して接続をオープンすることを選択した場合というアプローチをとっている将来のバージョン

this articleを読み取ることによって、回答myselsを発見したためにabbleました.Open()すると、 を実行する正当な理由があり、フレームワークでは のオープンを制御し、接続をクローズし、接続を終了しなくなると仮定します。

解決策は、EFコマンドを実行する前に接続を開くことです。

context.Database.Connection.Open(); 
+0

これはどのように行ったのですか?私はまったく同じことをしたいと思っています。 –

関連する問題