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

使用adal4j从Azure获取用户名和组信息,azure,active-directory,azure-active-directory,adal,Azure,Active Directory,Azure Active Directory,Adal,我正在开发一个移动应用程序,在其中我需要根据Azure AD对用户进行身份验证。基本上,用户将收到他们的组织电子邮件和密码,移动电话应用程序将其发送到后端服务器进行身份验证 我的“azure activedirectory library for java”的“公共客户端应用程序示例”正在运行,并且可以根据“graph.windows.net”进行身份验证: 私有静态身份验证结果getAccessTokenFromUserCredentials( 字符串用户名、字符串密码)引发异常{ Authe

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

我的“azure activedirectory library for java”的“公共客户端应用程序示例”正在运行,并且可以根据“graph.windows.net”进行身份验证:

私有静态身份验证结果getAccessTokenFromUserCredentials(
字符串用户名、字符串密码)引发异常{
AuthenticationContext上下文=null;
AuthenticationResult=null;
ExecutorService=null;
试一试{
服务=Executors.newFixedThreadPool(1);
context=新的AuthenticationContext(AUTHORITY、false、service);

“未来”,但获得“资源”https://graph.windows.net/xxx.com/groups?api-version=1.5“未为帐户注册。”

首先,您完全正确,adal4j未能返回UserInfo。原因是令牌请求未包含
scope=openid
参数,如果被调用方r需要一个
id\u令牌
。我打开了一个,它已经被打开了。因此,adal4j的更新副本将解决您第一个无法获取用户信息的问题

现在,关于当前用户的组成员身份:通常情况下,我建议您只需更改应用程序清单(通过Azure门户下载并上载,在应用程序的配置页面下),即可轻松完成此操作,包括:

"groupMembershipClaims": "All",
不幸的是,adal4j还没有在
getUserInfo()
的结果中包含groups声明,因此这可能对您没有多大作用(打开后,它实际上取决于实现的速度,或者您是否想实现自己)

无论如何,由于令牌中可能包含太多的组(由指示),因此您的应用程序应始终能够使用AAD图形API,以确保用户是其成员

这就引出了最后一点:adal4j没有实现Azure AD Graph API的客户端。因此,是的,您必须自己实现(或者使用/修改现有的OData客户端)


(您可以阅读更多信息。)

您开发的移动平台是什么?将用户名/密码传递给您自己的服务并不是一种推荐的方法。相反,您可以使用ADAL库之一(,)使用AAD直接从移动设备进行身份验证。我使用的是iOS和Android。您的操作偏离了轨道,我还没有决定。传递凭据的主要原因(通过ssl连接偏离轨道)我只有一个地方可以处理与Azure的接口。但是,为了安全起见,我可以看到使用ADAL库确实有一个优势,即您只需要传递密钥。好的,我已经提供并回答了(希望)你所有的问题,但实际上——我不推荐这种方法。我的建议是,你的客户端应用程序使用相应的ADAL库来获取令牌。这还有另一个优点,你可以使用这个(,)来保护对自己API的访问。谢谢你的全面回答。我也会测试iOS和Android的SDK,看看什么最有效。我也会看看上面提到的要点。我只想验证用户的真实性,这样本地客户端就可以做到。一旦我确定了用户的真实性,我就可以为我的用户创建一个web API,以便进行任何查询,并且我真的不需要任何关于用户自己请求的信息。这可能是一个更好、更省钱的方法。