2010-09-29 53 views
5

Tôi có trường hợp sử dụng trong đó UIWebView có thể cần phải kết nối với máy chủ web được bảo mật bằng NTLM. Tôi cũng có một trường hợp sử dụng, nơi tôi đã có thông tin đăng nhập được thông qua. Vì vậy, thay vì buộc người dùng nhập chúng, làm thế nào để tôi thực hiện cái bắt tay với UIWebView?Cách triển khai Xác thực NTLM cho UIWebView?

UPDATE:

Sử dụng phương pháp này here hoạt động tốt đủ khi bạn đang làm yêu cầu GET đơn giản, nhưng hoàn toàn thất bại khi thực hiện bài viết, cho một thực tế đơn thuần mà nó đang làm một GET sau khi nó được đăng tải.

ASIHttpRequest và ASIWebPageRequest có cùng vấn đề. GET yêu cầu làm việc kỳ diệu, nhưng bất kỳ POSTs chỉ không hoạt động. Nếu chỉ có thế giới làm việc trên chỉ GET yêu cầu.

Tôi đã có thể sử dụng this method trong đó bao gồm tên người dùng và mật khẩu trong chuỗi yêu cầu HTTP, nhưng điều đó không đáng tin cậy đến mức không chắc chắn vì lý do sử dụng nó. Sử dụng trình thám thính Tôi có thể thấy sự bắt tay ba chiều xảy ra mà không có bất kỳ vấn đề nào về cả hai yêu cầu GET và POST.

Trả lời

1

Kể từ iOS 3.2 và 4.1, không có công khai đại biểu nào để chặn thử thách NTLM. Tuy nhiên, có một API riêng tư có thể được overriden để cung cấp hỗ trợ thích hợp cho việc này. Vì điều này sẽ khiến ứng dụng của bạn có nguy cơ bị từ chối, tôi sẽ từ bỏ việc đăng mã vì nó không đáng để phát triển App Store tại thời điểm hiện tại.

+3

Mã sẽ thực sự hữu ích cho những người viết Ứng dụng nội bộ. –

-1

UIWebView không hỗ trợ xác thực. Với hệ điều hành iPhone 3.1, bạn có thể thêm thông tin đăng nhập vào bộ nhớ thông tin xác thực trung tâm và UIWebView ít nhất sẽ hoạt động với xác thực cơ bản. Nhưng bắt đầu với iOS 4.0, tôi không thấy bất kỳ cách nào để sử dụng xác thực (ngoại trừ cookie hoặc xác thực biểu mẫu dựa trên URL).

+0

Không đúng, một số các câu trả lời khác cung cấp cách để auth một uiwebview để người dùng của bạn không nhìn thấy bất cứ điều gì – Aaron

0

Nếu bạn sẵn sàng thử một số mã thử nghiệm, bạn có thể sử dụng ASIWebPageRequest.

Nó sẽ hơi khó hiểu, vì bạn phải tải xuống nội dung trang với ASIWebPageRequest, tải nó vào UIWebView, sau đó nắm bắt bất kỳ nhấp chuột liên kết nào trong chế độ xem web và lặp lại quy trình một lần nữa (nếu nội dung tại URL yêu cầu xác thực). Ngoài ra, tôi nghĩ bạn sẽ phải quản lý ngăn xếp lịch sử của riêng bạn.

Tôi không nghĩ rằng nó sẽ được dễ dàng, nhưng nó dường như có thể làm được, và nó có vẻ như nó nên làm việc miễn là mã ASIWebPageRequest không quá lỗi hoặc hạn chế.

+0

Tôi đã chơi với các lớp học của mình, nhưng không phải là một cụ thể. Tôi sẽ thử. –

+0

Không hoạt động với POST. –

+0

Dangit. Bạn có thể thử những gì được mô tả ở đây: http://stackoverflow.com/questions/3918512/objective-c-webkit-external-files-causing-401/3919181#3919181, nhưng tôi không có ý tưởng nào (nếu có) phương thức xác thực tương ứng tới NTLM. –

2

Bạn có thể thiết lập các chứng chỉ mặc định:

NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] 
              initWithHost: _host 
              port: 80 
              protocol: @"http" 
              realm: _host 
              authenticationMethod:NSURLAuthenticationMethodNTLM]; 

[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:[NSURLCredential credentialWithUser:_username password:_password persistence:NSURLCredentialPersistenceForSession] forProtectionSpace:protectionSpace]; 

Bây giờ bạn có thể cho WebViews bạn làm theo yêu cầu, và khi nó gặp protenctionSpace của bạn nó đăng nhập vào bằng cách sử dụng thông tin cho

+0

Tính năng này hoạt động cho ứng dụng của tôi, cảm ơn! – Aaron

Các vấn đề liên quan