1

我使用了https://docs.microsoft.com/en-us/azure/postgresql/howto-configure-sign-in-aad-authentication中的文档,使 Azure AD 中的用户能够使用令牌。我希望 Java 桌面应用程序的用户能够使用他们的用户名和密码进行身份验证并自动获取令牌。为此,我在我的租户中创建了一个公共应用程序。我使用用户名和密码进行身份验证以获取访问令牌没有问题,但该令牌显然不适合针对https://ossrdbms-aad.database.windows.net进行身份验证。

我收到错误消息“致命:访问令牌没有有效签名或已过期。请获取新令牌并重试。”

这是我正在使用的代码:

import com.microsoft.aad.msal4j.IAuthenticationResult;
import com.microsoft.aad.msal4j.PublicClientApplication;
import com.microsoft.aad.msal4j.UserNamePasswordParameters;

import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;
import java.util.Set;

public class AuthTest {

    private final static String APP_ID = "096f6bc7-cf30-4b06-9f0e-093aaf3f9a4c";
    private final static String AUTHORITY = "https://login.microsoftonline.com/organizations";

    private static Connection getConnection(final String serverName, final String userName, final String password)
            throws Exception {
        final String url = String.format("jdbc:postgresql://%s.postgres.database.azure.com/postgres", serverName);
        final Properties props = new Properties();
        props.setProperty("user", userName + "@" + serverName);
        props.setProperty("password", password);
        props.setProperty("sslmode", "require");
        return DriverManager.getConnection(url, props);
    }

    public static void main(final String[] args) throws Exception {
        final String serverName = args[0];
        final String userName = args[1];
        final String password = args[2];
        final PublicClientApplication pca = PublicClientApplication.builder(APP_ID).authority(AUTHORITY).build();
        final Set<String> scopes = Set.of(
                "User.Read"
        );
        final UserNamePasswordParameters parameters =
                UserNamePasswordParameters.builder(scopes, userName, password.toCharArray()).build();
        final IAuthenticationResult result = pca.acquireToken(parameters).get();
        final String token = result.accessToken();

        final Connection connection = getConnection(serverName, userName, token);
        System.out.println("connection=" + connection);
    }

}

我认为问题在于我需要将https://ossrdbms-aad.database.windows.net/default(或https://ossrdbms-aad.database.windows.net//.default)指定为资源或范围. 当我用这个替换 User.Read 时,我收到错误“AADSTS65001:用户或管理员未同意使用 ID 为 '096f6bc7-cf30-4b06-9f0e-093aaf3f9a4c' 名为 'AuthTest' 的应用程序。发送交互式授权请求对于这个用户和资源。”,这是可以理解的,因为我没有像对 User.Read 一样通过门户授予同意。但我不知道如何授予此同意。

4

1 回答 1

0

感谢 Jim Xu,我现在有了这个工作。我必须添加“Azure OSSRDBMS 数据库”权限,如https://i.stack.imgur.com/o4QO4.png所示,以管理员身份授予同意,然后将我的应用程序中的范围设置为https://ossrdbms -aad.database.windows.net/user_impersonation

于 2020-11-24T15:16:14.247 回答