2

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 から実行すると、すべてが機能し、期待どおりの行が得られます。

誰でも私を助けることができますか?何を間違えたのかわかりません。

4

1 に答える 1