Azure 用户登录失败'&书信电报;令牌识别主体>';但是在数据工作室工作

Azure 用户登录失败'&书信电报;令牌识别主体>';但是在数据工作室工作,azure,jdbc,azure-active-directory,azure-sql-database,Azure,Jdbc,Azure Active Directory,Azure Sql Database,我正在尝试使用我的AD帐户,使用Java8、JDBC驱动程序和我的accessToken连接到Azure SQL 当我使用我的广告帐户使用DataStudio时,我可以成功连接到Azure SQL DB 但当我使用Java程序时,它会给我以下错误: 请求处理失败;嵌套异常为com.microsoft.sqlserver.jdbc.SQLServerException:用户“”登录失败 我的代码摘要: SQLServerDataSource ds = new SQLServerDataSource

我正在尝试使用我的AD帐户,使用Java8、JDBC驱动程序和我的accessToken连接到Azure SQL

当我使用我的广告帐户使用DataStudio时,我可以成功连接到Azure SQL DB

但当我使用Java程序时,它会给我以下错误:

请求处理失败;嵌套异常为com.microsoft.sqlserver.jdbc.SQLServerException:用户“”登录失败

我的代码摘要:

SQLServerDataSource ds = new SQLServerDataSource();
        ds.setServerName("NAME.database.windows.net"); 
        ds.setDatabaseName("db-name"); 
        ds.setAccessToken(accessToken);
        ds.setEncrypt(true);
        ds.setTrustServerCertificate(true);
        try (Connection connection = ds.getConnection();
                Statement stmt = connection.createStatement();
                ResultSet rs = stmt.executeQuery("SELECT SUSER_SNAME()")) {
            if (rs.next()) {
                System.out.println("dbResults => You have successfully logged on as: " + rs.getString(1));
                res = rs.getString(1);
            }
        }

在评论中讨论之后,我们发现需要更改获取访问令牌时使用的范围。 指定了“User.Read.All”,这是
的缩写形式https://graph.microsoft.com/User.Read.All“
。 这意味着将返回一个Microsoft Graph API访问令牌,该令牌不适用于Azure SQL DB

将范围更改为
”https://database.windows.net/.default“
解决了问题。 这将获取Azure SQL DB的访问令牌,该令牌具有应用程序注册在Azure SQL DB上拥有的静态权限


文档:

这有帮助吗:?您是如何获得访问令牌的?@LeonYue:尝试了该链接,没有luck@juunas:我使用此示例经常获取MS Graph API的访问令牌,这不适用于SQL DB。你有没有试过解码访问令牌,看看观众是什么?它应该有类似于
aud的内容:https://database.windows.net/
一个问题-如何在作用域之间切换并获得适当的令牌?如何获取SQL Auth和Graph API的令牌?您需要使用不同的参数执行两次acquireToken调用。如果这些是代表用户的令牌,您通常可以使用刷新令牌来获取第二个令牌,因此第二个令牌不需要登录。