【问题标题】:How to check user credentials in AZURE AD when acquired token using appId/appSecret (adal4j)?使用 appId/appSecret (adal4j) 获取令牌时如何检查 AZURE AD 中的用户凭据?
【发布时间】:2024-05-18 23:05:01
【问题描述】:

我在 Azure AD 中创建了 webapp(非本机)。我有java代码(adal4j) 使用 appId/appSecret 凭据获取令牌:

    String clientId = "xxxxxxxxxxxxxxxxxxxxxx";
    String clientSecret = "yyyyyyyyyyyyyyyyyyyyyy";

    String resourceUrl = "https://graph.windows.net";
    String authorityUrl = "https://login.microsoftonline.com/zzzzzzzzzzzzzzzz/oauth2/authorize";
    ExecutorService executorService = Executors.newFixedThreadPool(4);

    Optional<UserInfo> userInfo = Optional.empty();

    try {

        AuthenticationContext authContext = new AuthenticationContext(authorityUrl, false, executorService);

        Future<AuthenticationResult> future = authContext.acquireToken(resourceUrl, new ClientCredential(clientId, clientSecret), null);
        AuthenticationResult result = future.get();
    }

现在我想检查指定的用户/密码组合是否在 Azure AD 中,如果是,则获取该用户的名字和姓氏。 是否有可能这样做 usinq 获得的令牌?如何使用 adal4j 编写这样的代码?

【问题讨论】:

  • 告诉我们您到底想要实现什么以及为什么。如前所述,您的问题与I would like to do a brute-force attack to identify valid credentials 类似。 Azure AD 中的线程保护机制将按此类解释您的操作,无论您的意图可能是好的。

标签: java azure-active-directory adal4j


【解决方案1】:

听起来您真正想做的是登录用户并获取他们的名字/姓氏。正如评论所说,建议的模式不是一个有效的模式,并且会代表一个安全问题。此外,clientIdclientSecret 的使用并不完全用于用户凭据,而是用于应用程序凭据。这用于没有用户交互的服务/api 应用程序的流,听起来不像您想要的。

现在,为了实现这一点,您将使用OpenID Connect protocol。为了简化将会发生的事情,您的应用(在用户尝试登录时)将重定向到 Microsoft 登录页面 (https://login.microsoftonline.com),输入他们的凭据并满足任何其他授权要求,同意您的应用,然后重定向回来。当他们回来时,您的应用程序将收到一个ID Token,可以对其进行验证并用于获取有关刚刚登录的用户的信息。在此期间,Azure AD / Microsoft 还将在浏览器上设置一个 cookie,以便用户将通过他们的帐户获得 SSO。

关于如何实现这一点,我建议关注ADAL4J Code Sample。这将为您的应用程序提供一个ID Token,以及一个可用于调用Microsoft Graph API 的访问/刷新令牌。此 API 还可以获取有关用户的信息(基本配置文件信息),以及他们的 Office365、Intune 和 Windows 数据。

【讨论】: