使用 NHibernate 和 Oracle 将连接字符串更新为 LDAP

Updating connection string to LDAP with NHibernate and Oracle

我继承了一个使用 NHibernate 和 FluentNibernate 连接到 Oracle 数据库的应用程序。不幸的是,我没有使用 NHibernate 的经验。当前的连接字符串是这样的:

Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=hostname)(PORT=0000)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=servicename)));User Id={username};Password={password};

但现在需要切换到 LDAP(请参阅最后一个代码片段)。

我的问题是,是否可以仅通过 LDAP 连接对 web.config 进行更改,还是我需要添加 Oracle.ManagedDataAccess 并进行一些代码更改?

据我了解,基于此 page 已弃用 OracleClientConfiguration,因此问题的一部分是关于新的 nuget 包。另外请注意,项目中没有 hibernate.cfg.xml 文件(我认为可以吗?)但想知道该项目是否没有使用 NHibernate 的最佳实践。任何其他提示或技巧将不胜感激。

C#代码:

private ISessionFactory GetSessionFactory()
{
      var connectionString = LoginHelper.GetConnectionString(ConnectionStringSetting, LoginInfoSetting);

      var iSessionFactory
         = Fluently
            .Configure()
            .Database(OracleClientConfiguration.Oracle10.ConnectionString(connectionString))
            .Mappings(e => e.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
            .BuildSessionFactory();

      return iSessionFactory;
}

Web.config(Web.config 中没有对 NHibernate 的其他引用。在其他 dll.config 文件中有一些对 dependentAssembly 的引用:

<configuration>
   <configSections>
      <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
   <configSections>
<configuration>

我(认为我)在 Web.config 中需要的是这样的:

<oracle.dataaccess.client> <!-- or <oracle.manageddataaccess.client>? -->
  <version number="*">
      <LDAPsettings>
         <LDAPsetting name="DIRECTORY_SERVERS" value="" />
         <LDAPsetting name="DIRECTORY_SERVER_TYPE" value="" />
         <LDAPsetting name="DEFAULT_ADMIN_CONTEXT" value="" />
      </LDAPsettings>
      <settings>
         <setting name="NAMES.DIRECTORY_PATH" value="" />
         <setting name="LDAP_ADMIN" value="" />
      </settings>
   </version>
</oracle.dataaccess.client> 

编辑 1: ldap.ora 文件的内容:

DIRECTORY_SERVERS=(ldap:XXX)
DEFAULT_ADMIN_CONTEXT="dc=Oracle,dc=com"
DIRECTORY_SERVER_TYPE=ad

根据documentation应该是这样的:

<LDAPsettings>
  <LDAPsetting name="DIRECTORY_TYPE" value="AD" />
  <LDAPsetting name="DEFAULT_ADMIN_CONTEXT" value="dc=Oracle,dc=com"/>
</LDAPsettings>

或使用

<settings>
  <setting name="TNS_ADMIN" value="C:\oracle\work"/>
</settings>

并在 C:\oracle\work\ldap.ora 文件中指定 LDAP 设置(结合 C:\oracle\work\sqlnet.ora 文件)。

我认为它仍然无效,但请查看

您可以使用简单的文本编辑器或使用配置工具修改配置文件OraProvCfg.exe。会是这样的:

OraProvCfg.exe /action:config /product:odpm /frameworkversion:v4.0.30319 /providerpath:C:\oracle\product.1\Client_x64\odp.net\managed\common\Oracle.ManagedDataAccess.dll /set:settings\TNS_ADMIN:C:\oracle\network\admin

OraProvCfg.exe /action:config /product:odpm /frameworkversion:v4.0.30319 /providerpath:C:\oracle\product.1\Client_x64\odp.net\managed\common\Oracle.ManagedDataAccess.dll /set:LDAPsettings\DIRECTORY_TYPE:ad

请注意,您有一个 OraProvCfg.exe 用于 32 位 (x86) 和 64 位。 运行 与您的应用程序匹配的那个,(或者只是 运行 两者)。

这是我为了让它工作所做的...

在 Oracle 文件夹结构中,导航到网络文件夹。

添加以下文件(应该能够复制并粘贴另一个名为 Sample 的文件夹):

  • sqlnet.ora
  • ldap.ora
  • tnsnames.ora

sqlnet.ora(这里的关键是将 LDAP 添加到列表的开头):

SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (LDAP, TNSNAMES, EZCONNECT)

ldap.ora:

DIRECTORY_SERVERS=(ldap:XXX:XXX)
DEFAULT_ADMIN_CONTEXT="dc=oracle,dc=com"
DIRECTORY_SERVER_TYPE=XX

tnsnames.ora:

No change was required; left as default

连接字符串:

<add name="connection" connectionString="Data Source=YourDataSource"/>
<!-- might need to add a username/password -->