写点什么

SAP ABAP Netweaver 服务器的标准登录方式讲解

作者:Jerry Wang
  • 2022 年 8 月 15 日
    四川
  • 本文字数:2092 字

    阅读完需:约 7 分钟

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 可以查看帮助文档。



如果对于 SICF 节点在 ABAP Netweaver 服务器里扮演的角色感兴趣,可以参考 Jerry 的文章:一个13年ABAP老兵的建议:了解这些基础知识,对ABAP开发有百利而无一害


Logon Procedure 帮助文档链接:https://help.sap.com/saphelp_me60/helpdata/en/a9/c8b14025a5c54ee10000000a1550b0/content.htm?no_cache=true


文档提到,当 Procedure 设置为 Standard 时,登录验证将会通过下面的顺序进行:



(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:


http://<XXXX>:50078/sap/bc/srt/wsdl/flv_10002A111AD1/bndg_url/sap/bc/srt/rfc/sap/zws_add/506/zjerry1/jerry1?sap-client=506


输入 url 敲回车,我能看到期望中的 WSDL 内容。然而我还观察到了一些有趣的现象:地址栏里的 http 自动被转换成了 https,同时工具 HTTP Watch 里观察到了一个 HTTP 307 重定向。



这个从 HTTP 协议端口 50078 自动重定向到 HTTPS 端口 44378 的行为,定义在事务码 SMICM 的参数里:



也可以通过事务码 RZ11,查看参数 icm/HTTP/redirect_0 的值。



然而,此时我根本没有指定任何用户名和密码,为什么我可以成功看到部署在 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 请求里,达到无需用户显式提供登录信息,也能成功访问服务器资源的目的。



当我将这个 MYSAPSSO2 cookie 清除之后,再次访问同一资源,又看到了久违的让我输入用户名和密码的弹出对话框。



这次输入用户名和密码之后,再次看到了 WSDL 内容,然而此次成功登录,采用的方式不是之前的 MYSAPSSO2 Logon Ticket,而是基于用户名和密码的 Basic Authentication 方式(下图蓝色高亮区域)。


注意到下图绿色高亮区域的 set-cookie:用户成功登录后,服务器颁发的 MYSAPSSO2 cookie,通过 HTTP 响应的 set-cookie 字段, 返回给浏览器。下一次浏览器再访问该资源时,会自动在 HTTP 请求里带上该 cookie 字段,又重新使用 MYSAPSSO2 Logon Ticket 的方式进行登录认证了。



下面是几种通过 ABAP 代码来访问 Netweaver 服务器资源时,如何指定登录认证信息的例子。

例 1:ABAP 代码里未提供任何登录认证信息


SAPGUI 里执行上图的 ABAP 代码,会遇到一个弹出对话框,只有手动输入用户名和密码,该代码才能顺利取回资源。



如果添加一行代码:


lo_http_client->propertytype_logon_popup = if_http_client=>co_disabled.


可以阻止用户名和密码输入的对话框弹出,但此时服务器会直接返回 HTTP 401 Unauthorized Error:


例 2:在 ABAP 程序里提供用户名和密码的几种方式

可以通过如下方式提供明文的用户名和密码:



也可以在事务码 SM59 里创建一个类型为 H:HTTP Connection to ABAP System 的 Destination:



将用户名和密码维护到这个 Destination 的 Logon & Security 页面的对应字段去:



然后基于这个 Destination 创建 cl_http_client 的实例。这种方式安全性比在代码里直接明文指定用户名和密码要好一些。



当然我也试过,将 MYSAPSSO2 的 cookie 值拷贝出来:



直接通过 set_cookie 方法设置给 cl_http_client 的实例,一样可以成功访问系统里的资源。



只是 cookie 有时效性,会过期,因此在生产场景的代码中,需要现用现取。关于 ABAP CL_HTTP_CLIENT 有关 cookie 的详细使用方式,请参考我的博客:


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


大家下次如果遇到有关 HTTP 请求和服务器登录认证的相关问题,不妨按照笔者本文介绍的方法,通过使用 HTTP Watch 和 Chrome 开发者工具,以及查阅 SAP 帮助文档的方式自行研究,感谢阅读。

发布于: 刚刚阅读数: 3
用户头像

Jerry Wang

关注

🏆InfoQ写作平台-签约作者🏆 2017.12.03 加入

SAP成都研究院开发专家,SAP社区导师,SAP中国技术大使。2007 年从电子科技大学计算机专业硕士毕业后加入 SAP 成都研究院工作至今。工作中使用 ABAP, Java, JavaScript 和 TypeScript 进行开发。

评论

发布
暂无评论
SAP ABAP Netweaver 服务器的标准登录方式讲解_web开发_Jerry Wang_InfoQ写作社区