【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available

Managed ,Java ,ODBC,代码 · 浏览次数 : 19

小编点评

**问题描述:** 在 App Service 中启用 Identity 后,使用系统自动生成 Identity 时,使用以下代码连接数据库 SQL Server 时出现错误: ``` ERROR 156 --- [ Thread-8] c.a.identity.ManagedIdentityCredential : Azure Identity => ERROR in getToken() call for scopes [https://database.chinacloudapi.cn//.default]: Managed Identity authentication is not available.ERROR 156 --- [p-nio-80-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.azure.identity.CredentialUnavailableException: Managed Identity authentication is not available.] ``` **问题解决:** 问题最关键的地方在于这句代码: ``` dataSource.setMSIClientId("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"); ``` 该代码尝试使用系统 Managed Identity 连接数据库 SQL Server,但由于用户没有提供正确的 Client ID,导致 `CredentialUnavailableException` 错误。 **解决方案:** 当使用 System Managed Identity 连接数据库 SQL Server 时,应该提供正确的 Client ID。根据文档,当使用 System Managed Identity 时,可以使用以下代码获取 Client ID: ``` string clientId = context.getEnvironmentVariable("APP_SERVICE_USER_ID_CLIENTID"); ``` 然后将获取到的 Client ID 代替 `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` 的值。 **完整代码示例:** ```java // 使用 System Managed Identity 连接数据库 SQL Server SQLServerDataSource dataSource = new SQLServerDataSource(); dataSource.setServerName("yoursqlservername.database.chinacloudapi.cn"); dataSource.setDatabaseName("db name"); dataSource.setAuthentication("ActiveDirectoryMSI"); // 获取 Client ID string clientId = context.getEnvironmentVariable("APP_SERVICE_USER_ID_CLIENTID"); // 设置 Client ID dataSource.setMSIClientId(clientId); // 连接数据库 SQL Server // ... ```

正文

问题描述

在App Service中启用Identity后,使用系统自动生成 Identity。

使用如下代码连接数据库 SQL Server:

        SQLServerDataSource dataSource = new SQLServerDataSource();
        dataSource.setServerName("yoursqlservername.database.chinacloudapi.cn"); // Replace with your server name
        dataSource.setDatabaseName("db name"); // Replace with your database name
        dataSource.setAuthentication("ActiveDirectoryMSI");
        // Optional
        dataSource.setMSIClientId("your app service systemd identity id"); // Replace with Client ID of User-Assigned Managed Identity to be used 

执行报错:

ERROR 156 --- [ Thread-8] c.a.identity.ManagedIdentityCredential : Azure Identity => ERROR in getToken() call for scopes [https://database.chinacloudapi.cn//.default]: Managed Identity authentication is not available.
ERROR 156 --- [p-nio-80-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.azure.identity.CredentialUnavailableException: Managed Identity authentication is not available.]

 

问题解答

================================================================================================================

其实,问题最关键的地方就是这句代码 

dataSource.setMSIClientId("your app service systemd identity id"); // Replace with Client ID of User-Assigned Managed Identity to be used 

参考文档中给出的示例代码这这句代码的要求是可选(Optional),并且说明是 当使用 User-Assigned Managed Identity的时候替换成自己的ID。

并没有说当使用System Managed Identity的时候也需要啊。

当写代码时,不小心,没有理解这句话,就会不由自主的把 System Managed Identity 的ID 添加到代码 dataSource.setMSIClientId("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");

就会导致了这次错误。

=================================================================================================================

 

所以,当使用System Managed Identity时,正确的连接代码其实很简单,就是:

        SQLServerDataSource dataSource = new SQLServerDataSource();
        dataSource.setServerName("yoursqlservername.database.chinacloudapi.cn"); // Replace with your server name
        dataSource.setDatabaseName("db name"); // Replace with your database name
        dataSource.setAuthentication("ActiveDirectoryMSI");

 

只有当使用的时User Managed Identity时候,才加上下面这句代码:

dataSource.setMSIClientId("your app service user identity id"); // Replace with Client ID of User-Assigned Managed Identity to be used 

 

 

参考资料

使用 Azure Active Directory 身份验证进行连接 : https://learn.microsoft.com/zh-cn/sql/connect/jdbc/connecting-using-azure-active-directory-authentication?view=sql-server-ver16

 

与【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available相似的内容:

【Azure 应用服务】Java ODBC代码中,启用 Managed Identity 登录 SQL Server 报错 Managed Identity authentication is not available

问题描述 在App Service中启用Identity后,使用系统自动生成 Identity。 使用如下代码连接数据库 SQL Server: SQLServerDataSource dataSource = new SQLServerDataSource(); dataSource.setSer

【Azure 应用服务】应用服务连接 Azure MySQL 一直失败,报错 Create connection error

问题描述 App Service上部署的Java应用,连接 Azure Database for MySQL 失败。错误信息:Create connection error, url: jdbc:mysql://....................... communications link

【Azure 应用服务】App Service 默认页面暴露Tomcat版本信息,存在安全风险

问题描述 在创建Azure App Service时,服务端的配置使用Java 8 + Tomcat 8.5。默认的根目录页面显示出App Service Tomcat版本信息,存在一定的安全隐患。 如何来避免这个问题呢? 问题解答 因为在初始创建App Service时,Azure会根据所选Sta

【Azure 应用服务】部署WAR包到App Service访问出现404错误的解决方式

问题描述 在Linux的App Service上,通过FTP把war文件和HTML静态文件上传到wwwroot目录下,静态文件访问成功,但是java应用中的请求都返回404错误 问题解决 因为FTP上传文件只是把文件放在 WWWROOT 目录中,并没有部署war包成功。如果要部署war包,需要使用w

【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题

问题描述 在Java应用中,使用 Lettuce 作为客户端SDK与Azure Redis 服务连接,当遇见连接断开后,长达15分钟才会重连。导致应用在长达15分的时间,持续报错Timeout 问题解答 这是 Lettuce 目前的一个未解决的已知问题,可以查看此 github issue来了解这个

【Azure 应用服务】使用Python Azure SDK 来获取 App Service的访问限制信息(Access Restrictions)

azure.core.exceptions.ClientAuthenticationError: Authentication failed: AADSTS70011: The provided request must include a 'scope' input parameter. The provided value for the input parameter 'scope' is

【Azure 应用服务】使用Docker Compose创建App Service遇见"Linux Version is too long. It cannot be more than 4000 characters"错误

{ "code":"DeploymentFailed", "message":"At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/arm-deployment-operations for usag

【Azure 应用服务】Azure JS Function 异步方法中执行SQL查询后,Callback函数中日志无法输出问题

Warning: Unexpected call to 'log' on the context object after function execution has completed. Please check for asynchronous calls that are not awaited or calls to 'done' made before function executi

【Azure 应用服务】登录App Service 高级工具 Kudu站点的 Basic Auth 方式

问题描述 从Azure App Service的页面中,直接跳转到高级管理工具Kudu站点(https://.scm.chinacloudsites.cn/)时,可以自动使用AAD用户(即登录Azure门户的订阅账号),同时,也可以使用App Servi

【Azure 应用服务】 在App Service中无法上传证书[Private Key Certificates (.pfx)],导入Azure Key Vault中的证书也无法成功

问题描述 在App Service的TLS/SSL settings页面,切换到Private Key Certificates (.pfx),通过Import Key Vault Certificate方式上传证书,提示成功,实际没有上传成功。通过Upload Certificate的方式上传证书