onprem机器到azure active directory,以便我们可以访问activedirectorymsi身份验证以及imds服务器

ny6fqffe  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(312)

我们希望将azuresqlserver与activedirectorymsi身份验证以及基于令牌的身份验证一起使用,并且我们能够从在azure网络中创建并添加为azure ad组成员的vm成功执行。为此,我们通过以下链接创建了contained user
https://docs.microsoft.com/en-us/azure/active-directory/managed-identities-azure-resources/tutorial-windows-vm-access-sql
并通过以下链接将vm添加为azureactivedirectory的一部分
com.microsoft.sqlserver.jdbc.sqlserverexception:msi令牌失败:无法从msi终结点获取令牌
我们可以使用imds服务器访问sql数据而不提供用户名和密码,并且可以使用http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3a%2f%2fdatabase.windows.net%2f

activedirectormsi URI字符串jdbc:sqlserver://azuresqlservername:1433;databasename=数据库名称;身份验证=activedirectorymsi。
但是当涉及到从onprem windows/linux/mac机器的访问时,我们不能访问azuresqlserver
有没有人可以建议我在prem上需要做什么,这样我们就可以访问azuresqlserver与activedirectorymsi身份验证以及基于令牌的身份验证?

jjhzyzn0

jjhzyzn01#

根据我的测试,如果你想连接azure sql本地机,请参考以下步骤
创建服务主体

az ad sp create-for-rbac -n 'name' --skip-assignment

将服务主体添加为azure sql数据库包含的用户。
设置环境变量。请将以下变量设置为环境变量

AZURE_TENANT_ID: ID of the service principal's tenant. Also called its 'directory' ID.

AZURE_CLIENT_ID: the service principal's client ID

AZURE_CLIENT_SECRET: one of the service principal's client secrets

软件开发包

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-identity</artifactId>
    <version>1.0.7</version>
</dependency>
<dependency>
    <groupId>com.microsoft.sqlserver</groupId>
    <artifactId>mssql-jdbc</artifactId>
    <version>8.2.2.jre8</version>
</dependency>

代码

public static void main( String[] args )
    {
     AccessToken token= GetAccessToken();
     SQLServerDataSource ds = new SQLServerDataSource();

        ds.setServerName("<>.database.windows.net"); // Replace with your server name.
        ds.setDatabaseName("demo"); // Replace with your database name.
        ds.setAccessToken(token.getToken());

        try (Connection connection = ds.getConnection(); 
                Statement stmt = connection.createStatement();
                ResultSet rs = stmt.executeQuery("SELECT SUSER_SNAME()")) {
            if (rs.next()) {
                System.out.println("You have successfully logged on as: " + rs.getString(1));
            }
        }

    }

    public static  AccessToken GetAccessToken() {
        DefaultAzureCredential creds = new DefaultAzureCredentialBuilder()
                .build();
        TokenRequestContext request = new TokenRequestContext();
        System.out.println("444");
        request.addScopes("https://database.windows.net//.default");
        String token;
        AccessToken accesstoken=creds.getToken(request).block();

        return accesstoken;

    }

相关问题