如何使用 JDBC 配置使用 AD 密码连接到 Azure SQL 数据库?

How do I connect to Azure SQL DB with AD password using JDBC configuration?

我正在尝试使用 Azure AD(应用程序作为数据库用户)从我的 Spring 引导 (2.0.1) Web 应用程序连接到 Azure SQL 数据库,但似乎无法连接点。

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

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

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

我尝试使用 'authentication=ActiveDirectoryPassword',但一直收到 'AADSTS50034: The user account does not exist in the directory' 错误。

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>

更大的目标是保护我对特定应用程序的数据库访问。我已将我的应用程序作为 Reader 添加到我的服务器上,理想情况下会验证为该应用程序以从该应用程序跟踪 usage/analytics/etc。

很抱歉,我是 Azure 和 Oauth 的新手。谢谢

请确认您使用的用户存在于数据库中,并且是您的数据库所在的同一租户中的用户。如果您使用的 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

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

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

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

还要注意令牌管理 ()。

包含具有以下配置的依赖项 adal4j 会有所帮助

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

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

我没有使用 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>