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