Ios 如何创建NTLM身份验证标头以与Alamofire一起使用?
这些是请求头:Ios 如何创建NTLM身份验证标头以与Alamofire一起使用?,ios,swift,alamofire,ntlm-authentication,Ios,Swift,Alamofire,Ntlm Authentication,这些是请求头: let userName = "someUserName" let password = "aPasswordForSomeUserName" var headers: HTTPHeaders = [ "Accept": "application/json", ] if let authorizationHeader = Request.authorizationHeader(user: userName, password: password) { head
let userName = "someUserName"
let password = "aPasswordForSomeUserName"
var headers: HTTPHeaders = [
"Accept": "application/json",
]
if let authorizationHeader = Request.authorizationHeader(user: userName, password: password) {
headers[authorizationHeader.key] = authorizationHeader.value
}
所以这是像这样生成授权
Basic aC5paHFoOkulbXKhNpk43A==
(我为安全性修改了它)
但当我提前向Rest客户端(一个chrome扩展)发出同样的请求时。我看到:
Accept: application/json
Authorization: NTLM TlMMTVNTUAADAAAAGAAYAG4AAAAYABgAhgAAAAYABgBAAAAADAAMAEYAAAAcABwAUgPPPAAAAACeAAAAAYIAAEUARwBBAGgALgBzAGgAYQBoAUIOVABHAC4AUSDFGC4ARQBHAEEALgBMAEEAToD38IenExnddmNhyXz+u0cmIHEl/p8P9OWe2rePPsiRkZO1Ne6ZrWxnIxHK1CZcyTU=
请注意,NTLM和Basic都包含在为我的用户名和密码生成的授权密钥中
如何在iOS(可能还有Alamofire)中做到这一点
这也引出了我之前问过的这个问题
我增强了这一点的正确答案,并使用Alamofire处理任何发送的请求,而不是为每个ViewController添加登录名:
private var manager : SessionManager?
var username: String? = nil
var password: String? = nil
func doesHaveCredentials() -> Bool {
self.username = Defaults[.username]
self.password = Defaults[.password]
guard let _ = self.username else { return false }
guard let _ = self.password else { return false }
return true
}
func apiManager() -> SessionManager{
if let m = self.manager{
return m
}else{
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 25
configuration.timeoutIntervalForResource = 25
self.manager = Alamofire.SessionManager(configuration: configuration)
let delegate: Alamofire.SessionDelegate = self.manager!.delegate
delegate.taskDidReceiveChallengeWithCompletion = { session, task, challenge, completionHandler in
print("Got challenge")
guard challenge.previousFailureCount == 0 else {
print("too many failures")
challenge.sender?.cancel(challenge)
completionHandler(.cancelAuthenticationChallenge, nil)
return
}
guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodNTLM else {
print("unknown authentication method \(challenge.protectionSpace.authenticationMethod)")
challenge.sender?.cancel(challenge)
completionHandler(.cancelAuthenticationChallenge, nil)
return
}
guard self.doesHaveCredentials() else {
challenge.sender?.cancel(challenge)
completionHandler(.cancelAuthenticationChallenge, nil)
DispatchQueue.main.async {
print("Userdata not set")
};
return
}
let credentials = URLCredential(user: self.username!, password: self.password!, persistence: .forSession)
challenge.sender?.use(credentials, for: challenge)
completionHandler(.useCredential, credentials)
}
return self.manager!
}
}
我在此增强了正确答案,并使用Alamofire处理任何发送的请求,而不是为每个ViewController添加登录名:
private var manager : SessionManager?
var username: String? = nil
var password: String? = nil
func doesHaveCredentials() -> Bool {
self.username = Defaults[.username]
self.password = Defaults[.password]
guard let _ = self.username else { return false }
guard let _ = self.password else { return false }
return true
}
func apiManager() -> SessionManager{
if let m = self.manager{
return m
}else{
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 25
configuration.timeoutIntervalForResource = 25
self.manager = Alamofire.SessionManager(configuration: configuration)
let delegate: Alamofire.SessionDelegate = self.manager!.delegate
delegate.taskDidReceiveChallengeWithCompletion = { session, task, challenge, completionHandler in
print("Got challenge")
guard challenge.previousFailureCount == 0 else {
print("too many failures")
challenge.sender?.cancel(challenge)
completionHandler(.cancelAuthenticationChallenge, nil)
return
}
guard challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodNTLM else {
print("unknown authentication method \(challenge.protectionSpace.authenticationMethod)")
challenge.sender?.cancel(challenge)
completionHandler(.cancelAuthenticationChallenge, nil)
return
}
guard self.doesHaveCredentials() else {
challenge.sender?.cancel(challenge)
completionHandler(.cancelAuthenticationChallenge, nil)
DispatchQueue.main.async {
print("Userdata not set")
};
return
}
let credentials = URLCredential(user: self.username!, password: self.password!, persistence: .forSession)
challenge.sender?.use(credentials, for: challenge)
completionHandler(.useCredential, credentials)
}
return self.manager!
}
}
+为了激励你?谢谢你,我可以用阿拉莫菲尔修复它。稍后我会发布我的答案。你能在这里发布你的工作答案吗?+为了激励你?谢谢你,我可以用阿拉莫菲尔修复它。我稍后会发布我的答案。你能在这里发布你的工作答案吗?