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に必要な値を設定することができますが、変更するまで、または接続が閉じられるまで、コンテキスト内で保持されることを期待しています。
ブログのカップルは、それが役に立つかどう異なるアプローチ、http://craigpickles.com/row-level-security-in-azure-sql-with-entity-framework/がわからない示しています。私は共有すると思った。 –
Entity Framework Core 2.0以降、グローバルクエリフィルタは、データベースを使用する代わりに、行レベルのセキュリティを改善するソリューションです。 http://gunnarpeipman.com/2017/08/ef-core-global-query-filters/ –