使用 adal4j 从 Azure 获取用户名和组信息

Getting username and group info from Azure using adal4j

我正在开发一个移动应用程序,我需要在其中根据 Azure AD 对用户进行身份验证。基本上,系统会提示用户他们的组织电子邮件和密码,移动 phone 应用程序会将其发送到将进行身份验证的后端服务器。

我有 'azure-activedirectory-library-for-java' 的 'public-client-app-sample' 工作,并且可以针对 'graph.windows.net' 进行身份验证:

private static AuthenticationResult getAccessTokenFromUserCredentials(
        String username, String password) throws Exception {
    AuthenticationContext context = null;
    AuthenticationResult result = null;
    ExecutorService service = null;
    try {
        service = Executors.newFixedThreadPool(1);
        context = new AuthenticationContext(AUTHORITY, false, service);
        Future<AuthenticationResult> future = context.acquireToken(
                "https://graph.windows.net", CLIENT_ID, username, password,
                null);
        result = future.get();
    } finally {
        service.shutdown();
    }

    if (result == null) {
        throw new ServiceUnavailableException(
                "authentication result was null");
    }
    return result;
}

但是,这 return 没有任何 userInfo(为空),此时我无法弄清楚如何查询以获取包含用户所属组的列表?

我只是使用从 Adal4j 获得的标记使用 API 进行手动查找,还是库中提供了函数?

我只是从 Azure 开始,所以很明显,我可能只是找错了地方。我试过了“https://graph.windows.net/xxx.com/groups?api-version=1.5”但得到“资源 'https://graph.windows.net/xxx.com/groups?api-version=1.5' 未注册该帐户。”

首先,您完全正确,adal4j 未能 return UserInfo。这样做的原因是令牌请求不包含 scope=openid 参数,如果调用者希望在响应中包含 id_token,则该参数是必需的。我开了一个issue, and it has already been resolved。因此,adal4j 的更新副本将解决您第一个未获取 UserInfo 的问题。

现在,关于当前用户的组成员身份:通常,我会建议您直接 configure you application to return the groups claim。这可以通过更改应用程序清单(通过 Azure 门户在应用程序的配置页面下下载和上传)来轻松完成,包括:

"groupMembershipClaims": "All",

不幸的是,adal4j 还没有在 getUserInfo() 的结果中包含团体声明,因此这可能对您没有多大用处(issue打开了,这真的取决于它实现的速度有多快,或者你是否想自己实现)。

无论如何,因为令牌中可能包含太多组(用 表示,您的应用程序应该始终能够使用 AAD 图 API 到 retrieve the full set of groups用户是成员。

最后一点:adal4j 没有实现 Azure AD Graph API 的客户端。所以是的,您必须自己实施(或者 use/modify 现有的 OData 客户端)。

(您可以阅读有关 Group Claims in this Azure AD blog post 的更多信息。)