Nano Hash - криптовалюты, майнинг, программирование

Аутентификация Swift 3 URLSession на сервере IBM Domino

Я новичок в iOS-разработке. Я хочу получить доступ к некоторым данным с сервера IBM Domino с аутентификацией. Код может вернуть только страницу входа на сервер. Кто-нибудь знает, что случилось? (и извините за мой английский)

Вот мой код для получения данных:

class URLSessionTest: NSObject, URLSessionDelegate {

let user = "myUser"
let password = "myPwd"
let url = URL.init(string: "https://www.example.com/Test.nsf/0/91182C6C9EEE0414C12580A300312D1A?Opendocument")


func getData() {
    var request = URLRequest.init(url: url!)
    request.httpMethod = "POST"
    request.timeoutInterval = 30.0
    let parameters = ["Username": user, "Password": password] as Dictionary<String, String>
    do {
        request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
    } catch let error {
        print("request serialization error: \(error.localizedDescription)")
    }
    let configuration = URLSessionConfiguration.default
    let session = URLSession(configuration: configuration, delegate: self, delegateQueue: nil)
    let task = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) in
        if error != nil {
            print ("dataTask error: \(error!.localizedDescription)")
        }
        if let myresponse = response as? HTTPURLResponse {
            print ("dataTask response: \(myresponse)")
            myresponse.statusCode
        }
        let myval = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)!
        print("dataTask data: \(myval)")
    })
    task.resume()
}

И делегаты:

open func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Swift.Void){
    print ("challenge \(challenge.protectionSpace.authenticationMethod)")
    var disposition: URLSession.AuthChallengeDisposition = .useCredential
    var credential:URLCredential?
    let defaultCredential = URLCredential(user: user, password: password, persistence: URLCredential.Persistence.none)
    if challenge.previousFailureCount > 0 {
        print ("cancel authentication challenge")
        disposition = .cancelAuthenticationChallenge
        credential = nil
    } else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
        print ("Server Trust")
        credential = URLCredential(trust: challenge.protectionSpace.serverTrust!)

        if (credential != nil) {
            print ("Use credential")
            disposition = .useCredential
        }
        else{
            print ("perform default handling")
            disposition = .performDefaultHandling
            credential = defaultCredential
        }
    }
    else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodClientCertificate {
        print ("client certificate")
    }
    else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodHTTPBasic {
        print ("Basic authentication")
    }
    else{
        disposition = .cancelAuthenticationChallenge
        credential = nil
    }
    if credential != nil { challenge.sender!.use(credential!, for: challenge)}
    completionHandler(disposition, credential);
}

func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    print ("URLSessionTask didReceive")
    let credential = URLCredential(user: user, password: password, persistence: URLCredential.Persistence.forSession)
    challenge.sender?.use(credential, for: challenge)
    completionHandler(URLSession.AuthChallengeDisposition.useCredential,credential)
}

Вот вывод кода:

challenge NSURLAuthenticationMethodServerTrust
Server Trust
Use credential
dataTask response: <NSHTTPURLResponse: 0x610000031780> { URL: https://www.example.com/Test.nsf/0/91182C6C9EEE0414C12580A300312D1A?Opendocument } { status code: 200, headers {
"Cache-Control" = "no-cache";
"Content-Length" = 5949;
"Content-Type" = "text/html; charset=UTF-8";
Date = "Sun, 12 Feb 2017 19:14:19 GMT";
Expires = "Tue, 01 Jan 1980 06:00:00 GMT";
Server = "Lotus-Domino";
"Strict-Transport-Security" = "max-age=0";} }
12.02.2017

  • Я предполагаю, что ваш код ожидает базовую аутентификацию. Проверьте, какой метод аутентификации настроен на сервере Domino для рассматриваемого домена. 12.02.2017
  • Кажется, это проблема, специфичная для IBM. Я попытался получить доступ к порталу IBM Websphere и дал аналогичные результаты, такие как IBM Domino. Тем не менее, я попробовал войти на сайт Microsoft SharePoint, и это было успешно. 13.02.2017
  • Сервер IBM Domino и IBM Websphere мог быть настроен на использование LTPA для аутентификации. Это может объяснить вашу проблему. Поэтому вам, скорее всего, нужно изменить метод аутентификации для сайта на сервере IBM Domino на базовую аутентификацию. 13.02.2017

Ответы:


1

Расширяя комментарий @Per Henrik Lausten, серверы Domino предоставляют способ обойти аутентификацию сеанса и разрешить базовую аутентификацию для URL-адресов, которые обращаются к определенному приложению. Метод описан в это техническое примечание IBM. Это лучшая альтернатива открытию всего сайта для базовой аутентификации. Я вижу, что вы используете https, и это хорошо, но свойства файлов NSF, к которым вы обращаетесь, также должны быть настроены так, чтобы требовалось подключение https, если они еще не установлены таким образом.

13.02.2017
  • Ну и наконец оставайтесь в базовой аутентификации, она реально работает. Спасибо! 14.02.2017
  • Поскольку это работает, пожалуйста, проголосуйте и примите мой ответ. 14.02.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..