SAP ABAP Netweaver伺服器的標準登入方式講解

i042416發表於2020-05-02

最近Jerry把這個公眾號之前釋出的總共230篇文章按照類別整理了一系列合集出來,比如所有的ABAP文章,放在了這個合集裡: 汪子熙的ABAP合集


SAP ABAP Netweaver伺服器的標準登入方式講解


本文繼續介紹ABAP裡的一個知識點:ABAP Netweaver伺服器的登入方式(Standard Logon Procedure).

本文的英文版最先釋出於SAP社群部落格,我當時負責處理客戶報過來的關於SAP CRM Web Service的incident,遇到一個HTTP 401錯誤訊息的知識點,發現我理解得不夠清楚,因此把SAP幫助文件找來研究了一番,寫下了這篇部落格:

Learn more detail about Standard logon procedure

我們在事務碼SICF裡隨便開啟一個節點,在標籤頁Logon Data裡發現Procedure這個欄位,設定的預設值為Standard,按F1可以檢視幫助文件。


SAP ABAP Netweaver伺服器的標準登入方式講解


如果對於SICF節點在ABAP Netweaver伺服器裡扮演的角色感興趣,可以參考Jerry的文章: 一個13年ABAP老兵的建議:瞭解這些基礎知識,對ABAP開發有百利而無一害

Logon Procedure幫助文件連結:  help.sap.com/saphelp_me

文件提到,當Procedure設定為Standard時,登入驗證將會透過下面的順序進行:


SAP ABAP Netweaver伺服器的標準登入方式講解


(1) Logon using HTTP fields (2) Logon with SSL certificates (3) Logon using SAP Logon Ticket (SSO) (4) HTTP Basic Authentication (5) Logon using SAP user password (SAP RFC logon) (6) Logon using SAML (7) Logon using user data stored in the service

下面我們就透過一些具體的例子,來理解這些不同的登入方式是如何進行的。

例如直接在瀏覽器裡開啟某Web Service的WSDL url:

輸入url敲回車,我能看到期望中的WSDL內容。然而我還觀察到了一些有趣的現象:位址列裡的http自動被轉換成了https,同時工具HTTP Watch裡觀察到了一個HTTP 307重定向。


SAP ABAP Netweaver伺服器的標準登入方式講解


這個從HTTP協議埠50078自動重定向到HTTPS埠44378的行為,定義在事務碼SMICM的引數裡:


SAP ABAP Netweaver伺服器的標準登入方式講解


也可以透過事務碼RZ11,檢視引數icm/HTTP/redirect_0的值。


SAP ABAP Netweaver伺服器的標準登入方式講解


然而,此時我根本沒有指定任何使用者名稱和密碼,為什麼我可以成功看到部署在ABAP Netweaver伺服器上,需要透過登入認證後才能訪問的資源?

這就是標準登入方式之一的Logon using SAP Logon Ticket (SSO-單點登入)在起作用。

摘錄一段SAP幫助文件裡對Logon using SAP Logon Ticket (SSO)的說明:

Logon using SAP Logon Ticket (MYSAPSSO2 cookie field). If no logon data is transferred as form fields or header fields, the system then tries to log on using a logon ticket. To enable this, the cookie field MYSAPSSO2 must be set.

用HTTP Watch(Chrome開發者工具也行)觀察我訪問WSDL發起的HTTP請求,果然發現了一個名為MYSAPSSO2的cookie,這是我之前成功登入伺服器之後,伺服器頒發給客戶端的logon ticket. 登入成功之後,接下來每次再訪問同一伺服器時,瀏覽器都會自動將該cookie設定到HTTP請求裡,達到無需使用者顯式提供登入資訊,也能成功訪問伺服器資源的目的。


SAP ABAP Netweaver伺服器的標準登入方式講解


當我將這個MYSAPSSO2 cookie清除之後,再次訪問同一資源,又看到了久違的讓我輸入使用者名稱和密碼的彈出對話方塊。


SAP ABAP Netweaver伺服器的標準登入方式講解


這次輸入使用者名稱和密碼之後,再次看到了WSDL內容,然而此次成功登入,採用的方式不是之前的MYSAPSSO2 Logon Ticket,而是基於使用者名稱和密碼的Basic Authentication方式(下圖藍色高亮區域)。

注意到下圖綠色高亮區域的set-cookie:使用者成功登入後,伺服器頒發的MYSAPSSO2 cookie,透過HTTP響應的set-cookie欄位, 返回給瀏覽器。下一次瀏覽器再訪問該資源時,會自動在HTTP請求裡帶上該cookie欄位,又重新使用MYSAPSSO2 Logon Ticket的方式進行登入認證了。


SAP ABAP Netweaver伺服器的標準登入方式講解


下面是幾種透過ABAP程式碼來訪問Netweaver伺服器資源時,如何指定登入認證資訊的例子。

例1:ABAP程式碼裡未提供任何登入認證資訊


SAP ABAP Netweaver伺服器的標準登入方式講解


SAPGUI裡執行上圖的ABAP程式碼,會遇到一個彈出對話方塊,只有手動輸入使用者名稱和密碼,該程式碼才能順利取回資源。


SAP ABAP Netweaver伺服器的標準登入方式講解


如果新增一行程式碼:

lo_http_client->propertytype_logon_popup = if_http_client=>co_disabled.

可以阻止使用者名稱和密碼輸入的對話方塊彈出,但此時伺服器會直接返回HTTP 401 Unauthorized Error:


SAP ABAP Netweaver伺服器的標準登入方式講解


例2:在ABAP程式裡提供使用者名稱和密碼的幾種方式

可以透過如下方式提供明文的使用者名稱和密碼:


SAP ABAP Netweaver伺服器的標準登入方式講解


也可以在事務碼SM59裡建立一個型別為H:HTTP Connection to ABAP System的Destination:


SAP ABAP Netweaver伺服器的標準登入方式講解


將使用者名稱和密碼維護到這個Destination的Logon & Security頁面的對應欄位去:


SAP ABAP Netweaver伺服器的標準登入方式講解


然後基於這個Destination建立cl_http_client的例項。這種方式安全性比在程式碼裡直接明文指定使用者名稱和密碼要好一些。


SAP ABAP Netweaver伺服器的標準登入方式講解


當然我也試過,將MYSAPSSO2的cookie值複製出來:


SAP ABAP Netweaver伺服器的標準登入方式講解


直接透過set_cookie方法設定給cl_http_client的例項,一樣可以成功訪問系統裡的資源。


SAP ABAP Netweaver伺服器的標準登入方式講解


只是cookie有時效性,會過期,因此在生產場景的程式碼中,需要現用現取。關於ABAP CL_HTTP_CLIENT有關cookie的詳細使用方式,請參考我的部落格:

Regarding cookie manipulation in CL_HTTP_CLIENT to avoid CSRF token validation failure issue

大家下次如果遇到有關HTTP請求和伺服器登入認證的相關問題,不妨按照Jerry本文介紹的方法,透過使用HTTP Watch和Chrome開發者工具,以及查閱SAP幫助文件的方式自行研究,感謝閱讀。

ABAP專題

要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":

SAP ABAP Netweaver伺服器的標準登入方式講解


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2689682/,如需轉載,請註明出處,否則將追究法律責任。

相關文章