Nhibernate を使用して SQL Server に行レベルのセキュリティを実装しようとしています。このアプローチを使用したかった: https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-entity-framework-row-level-security/。
nhibernate でインターセプターを作成しました。
public class TenantInterceptor : EmptyInterceptor
{
private readonly ITenantResolver _tenantResolver;
public TenantInterceptor(ITenantResolver tenantResolver)
{
_tenantResolver = tenantResolver;
}
public override void SetSession(ISession session)
{
string tenant = "sampleTenant";
if (_tenantResolver.Current != null)
tenant = _tenantResolver.Current.Id;
string queryFormat = @"Exec sp_set_session_context @key=N'@Tenant', @value='{0}'";
string query = string.Format(queryFormat, tenant);
session.CreateSQLQuery(query)
.ExecuteUpdate();
base.SetSession(session);
}
}
この方法でセッションにアタッチしました:
if (!CurrentSessionContext.HasBind(GetSessionFactory()))
{
_session = GetSessionFactory().OpenSession(new TenantInterceptor(_tenantResolver));
CurrentSessionContext.Bind(_session);
}
else
{
_session = GetSessionFactory().OpenSession(new TenantInterceptor(_tenantResolver));
}
また、SQL Server に次のコードがあります。
CREATE SCHEMA [Security]
go
CREATE FUNCTION [Security].tenantAccessPredicate(@Tenant nvarchar(255))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
SELECT 1 AS accessResult
WHERE @Tenant = CAST(SESSION_CONTEXT(N'@Tenant') AS nvarchar(255)) OR @Tenant = ''
だから私はすべてを正しくやったと思った。しかし、アプリケーションからクエリを実行すると、行がまったく表示されません。まったく同じ SQL コードをコピーして SQL Server Management Studio から実行すると、すべてが機能し、期待どおりの行が得られます。
誰でも私を助けることができますか?何を間違えたのかわかりません。