0

我是一位经验丰富的Java开发人员(4-5年),但是Azure AD及其功能尚属新手,因此我很抱歉提出一个潜在的基本问题。我一直在努力寻找任何微软文档或覆盖Java中的这个话题的堆栈溢出问题(绝大多数是用C#),并且从我的理解来看,C#拥有比Java更多的Azure AD库,因此C#中的解决方案不一定是解决方案Java的。验证Java中的Azure AD签名

我想完成一个基于场景的身份验证POC,其中存在一个现有的Azure AD系统,充满了用户,我想充当身份验证点。我的Java应用程序将收集用户的用户名和密码(我理解这是过时的,并且不理想,但是出于需要的原因),并使用Microsoft adal4j库调用Azure端点,以便成功返回JWC访问权限令牌(除了刷新和ID令牌)。

这是我现有的检索JWC访问令牌的代码片段。

private static AuthenticationResult getAccessTokenFromUserCredentials(String username, String password, String 
AUTHORITY, String CLIENT_ID) 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) { 
     System.out.println("ex)"); 
    } 
    return result; 
} 

public void azureAuthenticate(String authority, String clientID, String username, String password){ 
    AuthenticationResult result = null; 
    try { 
     result = getAccessTokenFromUserCredentials(username, password, authority, clientID); 
     DecodedJWT accessToken = JWT.decode(result.getAccessToken()); 
     //Want to verify the validity of this access token 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

} 

我的代码主要是基于这个Microsoft documentation

接收令牌后,我需要能够验证其真伪(我的理解证实其索赔的业务逻辑的一面,但我很困惑,以如何验证签名是否合法)。

非常感谢您的帮助,我很乐意提供所需的任何说明。

回答

2

客户端应用程序不需要验证令牌,服务器端(具有令牌的clinet应用程序调用)应该验证令牌。

来自Azure AD的访问令牌是由安全令牌服务以私钥签名的JSON Web令牌(JWT)。 A JWT token是一个未经加密的数字签名的JSON有效载荷,其中包含用于标识用户的不同属性(声明)。签名是JWT的最后部分,需要用于验证有效负载。使用标题(RS256,如果由AAD颁发)中描述的算法生成此签名以防止未经授权的访问。请参阅this document以获取有关JWT令牌的更多详细信息。

为了验证签名,首先我们应该检索并缓存唱歌令牌(公钥):1)第一次调用是发现端点。它的URL形成为'/.well-known/openid-configuration'.2)然后你会在这里找到很多的元数据,包括颁发者的值和端点地址以获得密钥来验证令牌的签名。

令牌签名根据JSON Web Key spec执行。使用令牌标题(分别为kid和x5t参数)中的密钥ID和X.509证书指纹值,然后在获得的密钥集合中查找适当的公钥以验证签名。我对java并不熟悉,但您可以参考this thread,其中包含有关如何验证Java中签名的代码示例。

+0

现在想通了,谢谢。 – dFrancisco