(在末尾添加了更新)
我有一个用Swift编写的本地iOS MobileFirst(7.0)客户端。 MobileFirst Server位于防火墙后面,并且可以通过IBM Web安全访问管理器(ISAM)上的连接点进行访问。 ISAM用于适配器身份验证。我已经在中间测试了没有ISAM的应用程序(无需身份验证),并且工作正常。
自定义质询处理程序已注册:
let myCH = MyChallengeHandler(vc: self)
WLClient.sharedInstance().registerChallengeHandler(myCH)
MyChallengeHandler在其init()函数中设置领域:
init(vc: LoginViewController){
self.vc = vc
super.init(realm: "HeaderAuthRealm")
}
该应用程序首先使用wlConnectWithDelegate连接到服务器:
WLClient.sharedInstance().wlConnectWithDelegate(ConnectListener(vc: self))
建立连接后,它应该在服务器上调用适配器方法以查找用户信息(使用invokeProcedure):
let invocationData = WLProcedureInvocationData(adapterName: "login", procedureName: "lookUpRole")
invocationData.parameters = [userid]
WLClient.sharedInstance().invokeProcedure(invocationData, withDelegate: LoginListener(vc: self))
然而,事情还没到那一步。
涉及ISAM时,它将保护所有内容,包括连接URL,因此,在尝试wlConnectWithDelegate()时,将首先调用质询处理程序,因为ISAM返回了登录页面。
质询处理程序正在正确检测登录页面,并正在调用handleChallenge()函数。如果需要,则从用户收集用户ID /密码,然后它调用一个调用SubmitLoginForm()的函数。定制的onConnect()和onFailure()函数也在质询处理程序中定义:
override func handleChallenge(response: WLResponse!)
{
handleChallengeISAM(response)
}
func handleChallengeISAM(response: WLResponse!)
{
//HPDIA0200W Authentication failed. You have used an invalid user name, password or client certificate.
let failedLogin = response.responseText.rangeOfString("HPDIA0200W") != nil
if vc.security.authDataSet && !failedLogin
{
println("=========== Sending login data directly")
submitISAMAuthData()
}
else
{
println("=========== A login screen form should appear")
if failedLogin {
needCredentials("Please check your credentials.")
} else {
needCredentials(nil)
}
}
}
func submitISAMAuthData()
{
let loginPostUrl = "https://wstest.clearlake.ibm.com/pkmslogin.form"
let params = ["username" : vc.security.userid , "password" : vc.security.password, "login-form-type" : "pwd"]
println("=========== Sending submitLoginForm request")
self.submitLoginForm( loginPostUrl, requestParameters: params, requestHeaders: nil, requestTimeoutInMilliSeconds: -1, requestMethod: nil)
println("=========== submitLoginForm request Sent")
}
override func onSuccess(response: WLResponse!)
{
println("=========== onSuccess")
let isLoginResponse = isCustomResponse(response)
if isLoginResponse {
println("=========== RE-challenged")
handleChallenge(response)
} else {
println("=========== Challenge success")
submitSuccess(response)
}
}
override func onFailure(response: WLFailResponse!)
{
println("=========== Challenge failure")
println("\(response.errorMsg)")
submitFailure(response)
}
问题是,就其所能解决的。该请求永远不会到达ISAM设备,并且永远不会调用onSuccess()或onFailure()函数。 iOS模拟器日志指出已发出请求,仅此而已。没有迹象表明它实际上做了任何事情。
=========== Sending submitLoginForm request
2015-04-09 15:00:12.866 ThirdPartyCompliance[54200:2903010] [DEBUG] [WL_AFHTTPCLIENTWRAPPER_PACKAGE] +[WLAFHTTPClientWrapper requestWithURL:] in WLAFHTTPClientWrapper.m:46 :: Request url is https://wstest.clearlake.ibm.com/pkmslogin.form
2015-04-09 15:00:12.871 ThirdPartyCompliance[54200:2903010] [DEBUG] [WL_REQUEST] -[WLRequest sendRequest:path:withOptions:] in WLRequest.m:141 :: Request timeout is 10.000000
2015-04-09 15:00:12.876 ThirdPartyCompliance[54200:2903010] [DEBUG] [WL_REQUEST] -[WLRequest sendRequest:path:withOptions:] in WLRequest.m:220 :: Sending request (https://wstest.clearlake.ibm.com/pkmslogin.form) with headers:
{
"Accept-Language" = en;
"User-Agent" = "ThirdPartyCompliance/1 (iPad Simulator; iOS 8.2; Scale/2.00)/WLNativeAPI/7.0.0.0";
"X-Requested-With" = XMLHttpRequest;
"x-wl-app-version" = "1.0";
"x-wl-device-id" = "C1CFD648-C648-439C-AC9F-8292FDAC20E6";
"x-wl-platform-version" = "7.0.0.0";
}
You can see the request body in the Analytics platform logs.
=========== submitLoginForm request Sent
尽管iOS MobileFirst API日志说了什么,但ISAM日志不显示曾经发送过的SubmitLoginForm请求。 v7.0中的commitLoginForm()有什么问题吗?
更新:
似乎WLClient.sharedInstance()。wlConnectWithDelegate()必须成功,然后ChallengeHandler.submitLoginForm()才能工作。我通过使用ISAM设备前面的代理服务器通过ISAM发送适配器服务请求来验证了这一点,所有其他MobileFirst服务器连接都绕过了ISAM。在这种体系结构中,由于wlConnectWithDelegate()无需登录即可成功执行,submitLoginForm()函数可以正常工作。
这有点令人困惑,因为在使用wlConnectWithDelegate()时调用了ChallengeHandler,但是,直到wlConnectWithDelegate()完成后,某些ChallengeHandler的方法才起作用。我也找不到它以这种方式工作的任何地方的文档。
最佳答案
当ISAM保护移动应用程序和MFP服务器之间的所有资源时,通过wlConnectWithDelegate()进行的初始调用将失败,因为该调用将不会到达MFP Server。初始连接URL必须不受保护(在ISAM中为不认证)。
此链接http://www-01.ibm.com/support/docview.wss?uid=swg24034222包含ISAM与worklight / Mobile First 7.x之间的集成解决方案。在v3.6集成解决方案中,有一个基于表单的登录集成指南(isam_impf_loginform_int_guide.pdf)。下面给出的URL是需要保持不受保护的URL,如果没有这些URL,则初始连接/基于证书的连接/ DirectUpdate将不会成功。
/WebSEAL/<webseal-host-name>-<instance-name>/<context-root>/apps/services/api/<application_name>/<platform>/init
/WebSEAL/<webseal-host-name>-<instance-name>/<context-root>/apps/services/api/<application_name>/<platform>/authenticate
/WebSEAL/<webseal-host-name>-<instance-name>/<context-root>/directUpdate/<application_name>/<platform>
/WebSEAL/<webseal-host-name>-<instance-name>/<context-root>/authorization/v1/clients/instance
我希望这有帮助。
关于ios - 使用ISAM身份验证时,MobileFirst ChallengerHandler无法从submitLoginForm调用返回,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29550068/