Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift-用于Windows身份验证的NSURLSession_Ios_Swift_Authentication_Nsurlsession - Fatal编程技术网

Ios Swift-用于Windows身份验证的NSURLSession

Ios Swift-用于Windows身份验证的NSURLSession,ios,swift,authentication,nsurlsession,Ios,Swift,Authentication,Nsurlsession,我在这里有一个类,类中有一个方法,我试图在需要windows身份验证用户名和密码的API上执行NSURLSession。我在这里遵循了教程 我想到了这个: let webservice = "https://api.com" let config = NSURLSessionConfiguration.defaultSessionConfiguration() let urlSession = NSURLSession(configuration: config) class WebServ

我在这里有一个类,类中有一个方法,我试图在需要windows身份验证用户名和密码的API上执行NSURLSession。我在这里遵循了教程

我想到了这个:

let webservice = "https://api.com"

let config = NSURLSessionConfiguration.defaultSessionConfiguration()
let urlSession = NSURLSession(configuration: config)

class WebService: NSObject {

    func loginUser(username: String, password: String) -> Bool {

        let userPasswordString = "username@domain.com:Password"
        let userPasswordData = userPasswordString.dataUsingEncoding(NSUTF8StringEncoding)
        let base64EncodedCredential = userPasswordData!.base64EncodedStringWithOptions([])
        let authString = "Basic \(base64EncodedCredential)"

        config.HTTPAdditionalHeaders = ["Authorization" : authString]

        let requestString = NSString(format:"%@", webservice) as String
        let url: NSURL! = NSURL(string: requestString)

        let task = urlSession.dataTaskWithURL(url) {
            (let data, let response, let error) in
            if (response as? NSHTTPURLResponse) != nil {
                let dataString = NSString(data: data!, encoding: NSUTF8StringEncoding)
                print(dataString)
            }
        }

        task.resume()

        return true

    }

}
但是当我运行这个程序时,我得到一个401错误:401-Unauthorized:由于凭据无效,访问被拒绝


我已确认API的URL是正确的。用户名和密码也一样。我做错了什么?

我可以通过以下操作修复此问题:

var credential: NSURLCredential!

    func loginUser(username: String, password: String) -> Bool {

        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)

        credential = NSURLCredential(user:username, password:password, persistence: .ForSession)

        let requestString = NSString(format:"%@", webservice) as String
        let url: NSURL! = NSURL(string: requestString)

        let task = session.dataTaskWithURL(url, completionHandler: {
            data, response, error in

            dispatch_async(dispatch_get_main_queue(),
            {

                if(error == nil)
                {
                    print("Yay!")
                }
                else
                {
                    print("Naw!")
                }

            })

        })

        task.resume()

        return true

    }
然后添加NSURLSessionLegate方法:

func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) {

        if challenge.previousFailureCount > 0
        {
            completionHandler(NSURLSessionAuthChallengeDisposition.CancelAuthenticationChallenge, nil)
        }
        else
        {
            completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, NSURLCredential(forTrust:challenge.protectionSpace.serverTrust!))
        }

    }

    func URLSession(session: NSURLSession, task: NSURLSessionTask, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) {

        completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential,credential)

    }

我可以通过执行以下操作来解决此问题:

var credential: NSURLCredential!

    func loginUser(username: String, password: String) -> Bool {

        let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
        let session = NSURLSession(configuration: configuration, delegate: self, delegateQueue: nil)

        credential = NSURLCredential(user:username, password:password, persistence: .ForSession)

        let requestString = NSString(format:"%@", webservice) as String
        let url: NSURL! = NSURL(string: requestString)

        let task = session.dataTaskWithURL(url, completionHandler: {
            data, response, error in

            dispatch_async(dispatch_get_main_queue(),
            {

                if(error == nil)
                {
                    print("Yay!")
                }
                else
                {
                    print("Naw!")
                }

            })

        })

        task.resume()

        return true

    }
然后添加NSURLSessionLegate方法:

func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) {

        if challenge.previousFailureCount > 0
        {
            completionHandler(NSURLSessionAuthChallengeDisposition.CancelAuthenticationChallenge, nil)
        }
        else
        {
            completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, NSURLCredential(forTrust:challenge.protectionSpace.serverTrust!))
        }

    }

    func URLSession(session: NSURLSession, task: NSURLSessionTask, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) {

        completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential,credential)

    }

正确的。您应该避免覆盖授权标头,因为NSURLSession保留对其进行践踏的权利。在某些情况下,您可以通过使用X-Authorization或类似方法来解决此问题,具体取决于服务支持的内容,但进行基本身份验证的正确方法是创建凭据,并让操作系统像您那样处理它。对。您应该避免覆盖授权标头,因为NSURLSession保留对其进行践踏的权利。在某些情况下,您可以通过使用X-Authorization或类似方法来解决此问题,具体取决于服务支持的内容,但进行基本身份验证的正确方法是创建凭据并让操作系统像您那样处理它。