(在末尾添加了更新)

我有一个用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/

10-10 21:30