You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署在Azure的应用如何通过SAML认证使用SAP HANA Node.js客户端连接HANA数据库?

使用@sap/hana-client通过SAML认证连接HANA(部署在Azure非SAP环境)

一、HANA端前置配置

  • 启用SAML认证:在HANA Cockpit或Studio中,修改instance_config.ini的[authentication]节点,设置saml_enabled = true,确保数据库开启SAML身份验证支持。
  • 注册Azure AD作为SAML身份提供商(IdP):
    • 从Azure AD导出IdP元数据XML文件(包含公钥、实体ID等核心信息)。
    • 在HANA中执行SQL注册该IdP:
      CREATE SAML PROVIDER AZURE_AD_IDP
      WITH METADATA FROM '<Azure AD元数据XML文件路径或直接填入XML内容>'
      ACTIVE = TRUE;
      
    • 配置用户映射:将Azure AD用户与HANA数据库用户关联,示例SQL:
      ALTER USER HANA_DB_USER SET SAML IDENTITY '<Azure AD用户的名称标识符>' FOR AZURE_AD_IDP;
      

二、Azure应用端获取SAML断言

通过Azure AD的Node.js SDK获取针对HANA的有效SAML断言:

  • 在Azure AD中注册你的Node.js应用,配置企业应用SAML单点登录,指定HANA的受众URI(即HANA的SAML服务提供者实体ID)和断言消费者服务URL。
  • 使用@azure/msal-node SDK获取断言,核心逻辑是通过客户端凭证流获取目标为HANA的令牌:
    const { PublicClientApplication } = require('@azure/msal-node');
    
    const msalConfig = {
      auth: {
        clientId: '你的Azure应用客户端ID',
        authority: 'https://login.microsoftonline.com/你的租户ID',
        clientSecret: '你的Azure应用客户端密钥'
      }
    };
    const pca = new PublicClientApplication(msalConfig);
    
    async function getSamlAssertion() {
      const tokenRequest = {
        scopes: ['https://你的HANA实例域名/saml'], // 需与HANA配置的受众URI一致
      };
      const response = await pca.acquireTokenByClientCredential(tokenRequest);
      return response.idToken; // 此处返回的即为Base64编码的SAML断言
    }
    

三、使用@sap/hana-client建立SAML连接

核心连接参数

  • serverNode:HANA数据库地址,格式为<主机名>:<加密端口>(生产环境推荐用443端口)
  • authentication:固定设为saml
  • samlAssertion:填入从Azure AD获取的SAML断言字符串
  • encrypt:设为true(生产环境强制加密)
  • sslValidateCertificate:生产环境设为true,需确保HANA的SSL证书被Azure应用信任

完整连接代码示例

const hanaClient = require('@sap/hana-client');
const { PublicClientApplication } = require('@azure/msal-node');

// 初始化MSAL客户端
const msalConfig = {
  auth: {
    clientId: 'YOUR_AZURE_APP_CLIENT_ID',
    authority: 'https://login.microsoftonline.com/YOUR_TENANT_ID',
    clientSecret: 'YOUR_AZURE_APP_CLIENT_SECRET'
  }
};
const pca = new PublicClientApplication(msalConfig);

async function connectToHana() {
  try {
    // 获取SAML断言
    const samlAssertion = await getSamlAssertion();

    // 建立HANA连接
    const conn = hanaClient.createConnection();
    const connParams = {
      serverNode: 'YOUR_HANA_HOST:443',
      authentication: 'saml',
      samlAssertion: samlAssertion,
      encrypt: true,
      sslValidateCertificate: true
    };

    conn.connect(connParams, (err) => {
      if (err) {
        console.error('连接失败:', err.message);
        return;
      }
      console.log('成功连接到HANA数据库');
      
      // 测试查询
      conn.exec('SELECT CURRENT_USER, CURRENT_TIMESTAMP FROM DUMMY', (err, result) => {
        if (err) {
          console.error('查询失败:', err.message);
        } else {
          console.log('查询结果:', result);
        }
        conn.disconnect();
      });
    });
  } catch (err) {
    console.error('认证或连接异常:', err.message);
  }
}

// 封装获取断言的函数
async function getSamlAssertion() {
  const tokenRequest = {
    scopes: ['https://your-hana-instance.com/saml'],
  };
  const response = await pca.acquireTokenByClientCredential(tokenRequest);
  return response.idToken;
}

connectToHana();

四、关键注意事项

  • 网络连通性:确保Azure应用所在的虚拟网络能访问HANA数据库的端口,需在Azure网络安全组和HANA防火墙中配置相应的入站规则。
  • 证书信任:启用sslValidateCertificate后,需将HANA的SSL根证书导入Azure应用的信任存储,或通过sslCertificate参数指定证书路径。
  • 断言有效性:HANA会验证SAML断言的签名、受众、过期时间,需确保Azure AD生成的断言参数与HANA配置完全匹配。
  • 权限配置:Azure应用需拥有获取SAML断言的权限,HANA映射用户需具备相应的数据库操作权限。

内容的提问来源于stack exchange,提问作者Claus Harbach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:17:42