【问题标题】:How do I connect to Azure SQL DB with AD password using JDBC configuration?如何使用 JDBC 配置通过 AD 密码连接到 Azure SQL DB?
【发布时间】:2019-05-26 10:49:58
【问题描述】:

我正在尝试使用 Azure AD(应用程序作为 DB 用户)从 Spring Boot (2.0.1) Web 应用程序连接到 Azure SQL DB,但似乎无法连接。

我按照Connecting using Azure AD Auth 的步骤进行操作。但是,我登录失败。

我假设这是因为没有在 JDBC url 中设置 'authentication' 属性,它只是直接对数据库进行身份验证(使用 CREATE USER FROM EXTERNAL PROVIDER 从指令创建的用户)?

有没有办法配置 spring 数据源/jdbc 库以在连接时使用正确的 Azure AD 身份验证 (adal4j-1.6.3)?该示例在代码中执行此操作,但我无法找到正确的配置。

我尝试使用“authentication=ActiveDirectoryPassword”,但不断收到“AADSTS50034:目录中不存在用户帐户”错误。

spring.datasource.url="jdbc:sqlserver://myServer.database.windows.net:1433;database=myDB;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout= 30;applicationName=myApp;"

spring.datasource.username: <user>
spring.datasource.accessToken: <key>

更大的目标是保护我对特定应用程序的数据库访问。我已将我的应用程序添加为我的服务器上的阅读器,理想情况下将作为该应用程序进行身份验证,以跟踪该应用程序的使用/分析/等。

我很抱歉,如果这太离谱了,我是 Azure 和 Oauth 的新手。谢谢。

【问题讨论】:

    标签: spring jdbc azure-active-directory adal4j


    【解决方案1】:

    对我来说,以下属性和依赖项有效:

    我没有使用 adal4j,而是使用 msal4j(Microsoft 推荐)

    spring:
      datasource:
        url: jdbc:sqlserver://<Azure SQL Server Name>.database.windows.net:1433;databaseName=<DB Name>;encrypt=true;loginTimeout=30
        username: <UserName>
        password: <Password>
        driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
        hikari:
          data-source-properties:
            authentication: ActiveDirectoryPassword
    

    pom.xml

    <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
        <version>9.2.1.jre8</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.microsoft.azure/msal4j -->
    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>msal4j</artifactId>
        <version>1.9.1</version>
    </dependency>
    

    【讨论】:

      【解决方案2】:

      在连接到 Azure SQL DB 时,无法将 Spring 配置为使用 Azure AD 中的应用程序 ID + 密钥代替用户名/密码。我发现的唯一方法是修改代码并创建一个返回 SQLServerDataSource 的 @Bean 方法,我在其中手动检索客户端凭据访问令牌并将其传递到数据源中。

      Connecting using an access token - 显示如何检索令牌并在数据源上设置

      Creating a custom Data Source - 展示如何使用 Spring 创建和使用自定义数据源

      还要注意令牌管理 (see my other question)。

      【讨论】:

        【解决方案3】:

        在以下配置中包含依赖 adal4j 会有所帮助

        spring.datasource.username=\<your AD username\>
        spring.datasource.password=\<your AD password\>
        spring.datasource.hikari.data-source-properties.authentication=ActiveDirectoryPassword
        

        【讨论】:

          【解决方案4】:

          请确认您使用的用户存在于数据库中,并且是您的数据库所在的同一租户中的用户。如果您使用的 Microsoft JDBC Driver 版本早于 4.0 版本,则还需要将服务器名称附加到连接字符串的 UserId 中。

          https://docs.microsoft.com/en-us/sql/connect/jdbc/connecting-to-an-azure-sql-database?view=sql-server-2017

          【讨论】:

          • 我正在使用:&lt;dependency&gt; &lt;groupId&gt;com.microsoft.sqlserver&lt;/groupId&gt; &lt;artifactId&gt;mssql-jdbc&lt;/artifactId&gt; &lt;version&gt;6.4.0.jre8&lt;/version&gt; &lt;/dependency&gt; 我在数据库(不是服务器级别)中有一个用户,其名称与 Azure AD 中应用程序的显示名称相同。
          • 用户存在于具有 CONNECT 权限的数据库中。 Azure SQL DB 审核显示登录错误 18456 error_state 5
          猜你喜欢
          • 2023-04-01
          • 2019-12-27
          • 2021-11-30
          • 2017-04-07
          • 2016-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-29
          相关资源
          最近更新 更多