【问题标题】:ADAL4J in java application not working for native application(Azure Active Directory) when Multi Factor Authentication is enabled启用多因素身份验证后,Java 应用程序中的 ADAL4J 不适用于本机应用程序(Azure Active Directory)
【发布时间】:2018-08-13 13:23:22
【问题描述】:

嗨,我们在 AAD 中创建了一个本机应用程序,我们正在尝试在我们的 java 应用程序中使用 Adal4j 从 Azure 获取访问令牌,下面是 sn-p

AuthenticationContext authContext;
    AuthenticationResult authResult;
    String loginUrl="https://login.microsoftonline.com/"+TENANTID+"/oauth2/authorize";
    service = Executors.newFixedThreadPool(1);
    authContext = new AuthenticationContext(loginUrl, false, service);
    Future<AuthenticationResult> future = authContext.acquireToken("https://management.azure.com/", clientId, username,password, null);
    authResult = future.get();
    System.out.println("Token :"+authResult.getAccessToken());

但最近我们的组织启用了多因素身份验证,从那时起我们收到以下错误。

java.util.concurrent.ExecutionException: com.microsoft.aad.adal4j.AuthenticationException: {"error_description":"AADSTS50076: 由于您的管理员进行了配置更改,或者因为您移动到了新位置,您必须使用多重身份验证访问“797f4846-ba00-4fd7-ba43-dac1f8f63013”。\r\n跟踪 ID:c0ac222e-5a9b-417e-8360-d42712f43c00\r\n相关 ID:96cc11c4-3196-448d-a416-a9373b8 r\n时间戳:2018-08-13 12:57:59Z","error":"interaction_required"}

请帮助我解决此错误 ADAL4j 版本为 1.1.3

我使用以下方法创建了应用注册

请让我知道我缺少什么,因为我看到它显示的是您的帐户而不是我的帐户。为我的租户启用了 MFA。

【问题讨论】:

    标签: java azure azure-active-directory azure-resource-manager


    【解决方案1】:

    请帮助我解决这个错误 ADAL4j version is 1.1.3

    如果用户启用了multi factor authentication,我们不能使用它来获取访问令牌以直接访问资源。

    两步验证的安全性在于其分层方法。破坏多个身份验证因素对攻击者来说是一项重大挑战。即使攻击者设法获知用户的密码,如果没有额外的身份验证方法,它也是无用的。它通过要求以下两种或多种身份验证方法来工作:

    • 您知道的信息(通常是密码)
    • 您拥有的东西(不易复制的受信任设备,例如手机)
    • 你是什么(生物识别)

    我们正在尝试在我们的 java 应用程序中使用 Adal4j 从 Azure 获取访问令牌

    您可以注册一个 Azure AD Web 应用程序并使用以下方式来代替使用用户名和密码来获取访问令牌。如何注册 Azure AD webapp 并从中获取密钥,请参考tutorial

    String resourceUrl = "https://management.azure.com";
    AuthenticationContext context = new AuthenticationContext(authority, true, service);
    // Acquire Token
    Future<AuthenticationResult> result = context.acquireToken(
    resourceUrl,
    new ClientCredential(APP_ID, APP_SECRET),
    null
    );
    String token = result.get().getAccessToken();
    

    更新:

    添加获取订阅的演示代码。如果您得到空列表意味着您的租户没有订阅。

    String authority = "https://login.microsoftonline.com/{tenantId}";
    String resourceUrl = "https://management.azure.com";
    ExecutorService service = Executors.newFixedThreadPool(1);
    AuthenticationContext context = new AuthenticationContext(authority, true, service);
        // Acquire Token
    Future<AuthenticationResult> result = context.acquireToken(
                resourceUrl,
             new ClientCredential(APP_ID, APP_SECRET),
        null
        );
    String token = result.get().getAccessToken();
    HttpClient client = HttpClientBuilder.create().build();
    HttpGet request = new HttpGet("https://management.azure.com/subscriptions?api-version=2016-06-01");
    request.addHeader("Authorization",result.get().getAccessTokenType()+ " "+ result.get().getAccessToken());
    HttpResponse response = client.execute(request);
    HttpEntity entity = response.getEntity();
    // Read the contents of an entity and return it as a String.
    String content = EntityUtils.toString(entity);
    System.out.println(content);
    

    测试结果:

    更新2:

    如何使用 Azure 门户切换目录。

    直接用List subscriptions Rest API 试试吧。

    【讨论】:

    • 感谢您使用上述代码的回复,我将获得访问令牌,但是当我尝试使用以下代码获取订阅时,它返回空列表。 GET management.azure.com/subscriptions/?api-version=2016-03-30 O/p:{"value":[]}
    • 您介意分享获取订阅代码或休息 api 端点吗?
    • 我正在调用“management.azure.com/subscriptions/?api-version=2016-03-30”,通过将标头键“Authorization”标头值传递为“bearer TOKEN”
    • 它应该可以工作,请确保您的租户有订阅。如果你得到空列表意味着你的租户没有订阅。
    • 我已经编辑了我的问题并添加了我注册应用程序的方式,我的订阅也属于租户 ID,但在租户中启用了 MFA,我认为这是问题所在。
    猜你喜欢
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    相关资源
    最近更新 更多