You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于MSAL而非ADAL通过Azure Web API创建DNS区域及记录?

没问题!我来给你梳理清楚怎么用MSAL替代旧的ADAL密钥认证,通过Azure Java SDK创建DNS区域和记录——毕竟MSAL是微软现在主推的身份验证库,比旧方式更灵活安全。

核心思路

旧代码里的ApplicationTokenCredentials依赖ADAL实现认证,而我们要做的是:

  1. 用MSAL的Java库获取针对Azure管理API的访问令牌
  2. 将这个令牌封装成Azure SDK能识别的凭据对象
  3. 用新的凭据初始化Azure客户端,再执行DNS操作
步骤与代码示例

1. 添加必要依赖

先在你的Maven/Gradle项目里引入MSAL和Azure SDK的相关依赖:

<!-- MSAL Java 身份验证库 -->
<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>msal4j</artifactId>
    <version>1.14.0</version> <!-- 建议用最新稳定版 -->
</dependency>
<!-- Azure SDK for DNS 管理 -->
<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure</artifactId>
    <version>1.41.4</version> <!-- 选择与MSAL兼容的版本 -->
</dependency>
<!-- Azure Core 令牌凭据支持 -->
<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-core</artifactId>
    <version>1.26.0</version>
</dependency>

2. 完整实现代码

下面是从获取MSAL令牌到创建DNS区域、添加记录的完整代码:

import com.microsoft.aad.msal4j.ClientCredentialFactory;
import com.microsoft.aad.msal4j.ClientCredentialParameters;
import com.microsoft.aad.msal4j.ConfidentialClientApplication;
import com.microsoft.aad.msal4j.IAuthenticationResult;
import com.microsoft.azure.AzureEnvironment;
import com.microsoft.azure.management.Azure;
import com.microsoft.azure.management.dns.DnsZone;
import com.microsoft.azure.management.resources.Region;
import com.microsoft.azure.management.resources.ResourceGroup;
import com.microsoft.azure.tokencredentials.AccessTokenCredentials;

import java.util.Collections;
import java.util.concurrent.CompletableFuture;

public class MsalDnsManager {

    // 用MSAL获取Azure管理API的访问令牌
    private static IAuthenticationResult getMsalAccessToken(String clientId, String tenantId, String clientSecret) throws Exception {
        // 初始化机密客户端(服务端场景用机密客户端模式)
        ConfidentialClientApplication msalApp = ConfidentialClientApplication.builder(
                clientId,
                ClientCredentialFactory.createFromSecret(clientSecret))
                .authority("https://login.microsoftonline.com/" + tenantId)
                .build();

        // 请求Azure管理API的默认权限范围
        ClientCredentialParameters authParams = ClientCredentialParameters.builder(
                Collections.singleton("https://management.azure.com/.default"))
                .build();

        // 异步获取令牌并返回
        CompletableFuture<IAuthenticationResult> tokenFuture = msalApp.acquireToken(authParams);
        return tokenFuture.get();
    }

    public static void main(String[] args) throws Exception {
        // 替换成你的Azure配置信息
        String clientId = "你的应用注册客户端ID";
        String tenantId = "你的租户ID";
        String clientSecret = "你的应用注册客户端密钥";
        String subscriptionId = "你的订阅ID";
        String resourceGroupName = "dns-resource-group";
        String domainName = "example.com";

        // 1. 获取MSAL访问令牌
        IAuthenticationResult authResult = getMsalAccessToken(clientId, tenantId, clientSecret);
        String accessToken = authResult.accessToken();

        // 2. 创建基于MSAL令牌的凭据对象
        AccessTokenCredentials credentials = new AccessTokenCredentials(
                accessToken,
                AzureEnvironment.AZURE);

        // 3. 认证并初始化Azure客户端
        Azure azureClient = Azure.authenticate(credentials).withSubscription(subscriptionId);

        // 4. 创建资源组(如果不存在)
        ResourceGroup dnsRg = azureClient.resourceGroups().define(resourceGroupName)
                .withRegion(Region.US_EAST2)
                .create();
        System.out.println("已创建资源组:" + dnsRg.name());

        // 5. 创建根DNS区域
        System.out.println("正在创建DNS区域:" + domainName);
        DnsZone rootZone = azureClient.dnsZones().define(domainName)
                .withExistingResourceGroup(dnsRg)
                .create();
        System.out.println("DNS区域创建完成:" + rootZone.name());

        // 6. 可选:添加A记录示例
        rootZone.recordSets().defineA("www")
                .withIPv4Address("192.168.1.100")
                .withTimeToLive(300)
                .create();
        System.out.println("已添加A记录:www." + domainName);
    }
}
关键细节说明
  • MSAL模式选择:这里用的是机密客户端模式,适合服务端到Azure的无人值守认证场景,符合你的Azure Web服务API需求。
  • 权限范围:https://management.azure.com/.default表示请求服务主体(你的应用注册)拥有的所有Azure管理API权限,需要确保你的应用注册被分配了DNS Zone Contributor或更具体的权限(比如在订阅/资源组级别)。
  • 令牌过期处理:MSAL会自动处理令牌缓存和刷新,如果是长时间运行的服务,建议利用MSAL的缓存机制避免重复请求令牌。
注意事项
  • 不要硬编码clientSecret这类敏感信息,建议用Azure Key Vault或环境变量存储。
  • 确保你的服务主体(应用注册)在Azure门户中被分配了足够的DNS操作权限,否则会报权限不足的错误。
  • 定期检查依赖版本,保持MSAL和Azure SDK的版本兼容,避免出现依赖冲突。

内容的提问来源于stack exchange,提问作者Atif Hussain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 10:17:49