2012-05-31 39 views
5

Tôi hiện đang cố gắng sử dụng Luồng tác nhân người dùng OAuth 2.0 với ứng dụng C# của khách hàng và tôi đang gặp phải một số nhầm lẫn liên quan đến URI chuyển hướng.Luồng tác nhân người dùng OAuth với C# Desktop App

Vì tôi đang làm việc với ứng dụng khách hàng, tôi không thể cung cấp URL chuyển hướng chuẩn cho máy chủ web. Tuy nhiên, theo những người tôi đang cố gắng xác thực với (Salesforce, trong trường hợp này), Luồng tác nhân người dùng là chính xác để sử dụng cho ứng dụng khách.

Câu hỏi của tôi là, tôi có thể làm gì để nhận mã thông báo truy cập trong tình huống này? Rõ ràng tôi có thể tạo một "tài nguyên cục bộ có thể truy cập được cho khách hàng", nhưng tôi không quen thuộc với các cơ chế đằng sau điều này, và tôi không thể tìm thấy bất kỳ tài nguyên nào về chủ đề (một phần vì tôi không biết phải tìm kiếm gì).

Bất kỳ con trỏ nào về nơi tôi nên bắt đầu tìm kiếm sẽ được đánh giá cao.


Edit: Một số đào hơn đã tiết lộ câu hỏi stackoverflow sau:

How do I develop against OAuth locally?

tôi đang làm một số chi tiết điều tra với những gì họ đề nghị, nhưng bất cứ đề nghị khác sẽ là tuyệt vời là tốt.


Edit: Một số phải tìm kiếm nhiều tiết lộ bài viết này:

http://sarangasl.blogspot.com/2010/09/create-simple-web-service-in-visual.html

Tuy nhiên cảm thấy như mình đang chọc xung quanh trong bóng tối mà không có một sự hiểu biết về bức tranh lớn hơn, nhưng tôi tin rằng tôi cần phải thiết lập một dịch vụ web cục bộ bằng cách sử dụng localhost và trỏ URI chuyển hướng của tôi ở đó. Sau đó tôi sẽ sử dụng dịch vụ web của tôi để gỡ bỏ phản hồi từ máy chủ OAuth và yêu cầu ứng dụng của tôi phản hồi một cách thích hợp. Các bản cập nhật khác sẽ đến.


Ooookay. Vì vậy, từ những gì tôi đã có thể thu thập, tôi cần phải thiết lập một dịch vụ web cục bộ để cung cấp như gọi lại cho OAuth. Tôi cần phải lắng nghe bản thân dịch vụ web nói trên và bắt được cuộc gọi lại để chuyển nó tới ứng dụng của tôi. Tuy nhiên, dịch vụ web ASP.NET mặc định được cung cấp bởi VS2010 không hỗ trợ các tham số URL, chỉ các cuộc gọi API, vì vậy tôi dường như cần sử dụng bộ khởi động WCF Rest starter.

Tôi hoàn toàn xa lạ với tất cả những điều này, vì vậy mọi mẹo sẽ là một ơn trời tại thời điểm này. Nói chung, tôi nghĩ tôi đã thiết lập một dịch vụ WCF Rest cục bộ, cung cấp URI cục bộ cho OAuth làm gọi lại, và sau đó bắt URL gọi lại bằng dịch vụ Rest. Sau đó, tôi phân tích cú pháp URL và trích xuất mã thông báo truy cập. Tại thời điểm này, ứng dụng của tôi có yêu cầu mã thông báo truy cập hay dịch vụ web của tôi có thể cung cấp mã thông báo cho ứng dụng của tôi không? Tức là, vị trí kiểm soát nên ở đâu?

Trả lời

4

Đã tìm ra cách thông minh để giải quyết vấn đề này. Thay vì thiết lập một dịch vụ để nghe URL chuyển hướng của OAuth, tôi đã nhúng một điều khiển WebBrowser bên trong biểu mẫu Windows của tôi.

Tôi đã chỉ WebBrowser được nhúng này vào URL xác thực và cho phép người dùng đăng nhập và xác thực với Salesforce và cấp quyền cho ứng dụng của tôi.Sau đó, tôi cho phép Salesforce chuyển hướng trình duyệt được nhúng của tôi đến URL chuyển hướng giả mà tôi cung cấp. Chuyển hướng này không bao giờ thực sự đi đến đâu, nó chỉ hiển thị dưới dạng 404.

Tuy nhiên, bằng cách theo dõi WebBrowser.Url, tôi có thể lấy toàn bộ URL mà điều khiển WebBrowser được nhúng của tôi được hướng đến, bao gồm cả mã thông báo truy cập được thêm vào bởi Salesforce. Về cơ bản, sau khi người dùng xác thực và cấp quyền, trình duyệt được nhúng sẽ được chuyển hướng đến "http://www.dummyurl.com". Salesforce gắn thêm các thẻ truy cập, vì vậy WebBrowser.Url kết thúc lên tìm kiếm một cái gì đó như thế này:

http://www.dummyurl.com#access_token=ABCDEF&instance_url=ABCDEF

Từ đây, tôi chỉ có thể phân tích cú pháp URL và đi trên con đường của tôi. Không yêu cầu dịch vụ web địa phương hoặc máy chủ web của bên thứ ba. :)

+2

Đây sẽ là một lựa chọn. Nhưng hãy cẩn thận: người dùng có thể sử dụng một số thủ thuật trên WebBrowser của bạn như đi tiếp và lùi trong lịch sử trình duyệt, làm mới trang, hết thời gian chờ, mất mạng. BẠN sẽ phải xử lý tất cả các mã lỗi HTTP + tất cả các thủ thuật khó chịu của trình duyệt được nhúng. Chúc may mắn :) –

+0

Plus xem xét giao diện người dùng của ứng dụng của bạn, có thể, khác với giao diện được Salesforce đề xuất - và bạn không thể thay đổi mặc định của họ vì bạn không có quyền kiểm soát nó. –

+0

Ugh, bạn nói đúng. Tôi sẽ phải xem xét bảo mật trình duyệt nhúng tiếp theo. Tuy nhiên, theo như giao diện người dùng, ứng dụng của tôi là một quá trình nền tạo ra cửa sổ bật lên trên các sự kiện nhất định, vì vậy xác thực chỉ được yêu cầu một lần cho mỗi lần khởi chạy ứng dụng (thường là một lần mỗi ngày, vào buổi sáng). Mặc dù vậy, nhờ các mẹo này, tôi đã quên mất các lỗ hổng bảo mật có khả năng được mở bằng một cá thể IE được nhúng. – sichinumi

1

Gọi loại ủy quyền bạn cần có máy khách tự động http://wiki.developerforce.com/page/Digging_Deeper_into_OAuth_2.0_on_Force.com#Obtaining_a_Token_in_an_Autonomous_Client_.28Username-Password_Flow.29. Đọc về URL bạn phải gửi ở đó.

grant_type=password&client_id=<your_client_id>&client_secret=<your_client_secret>&username=<your_username>&password=<your_password> 
+0

Tôi không thể sử dụng luồng đó, thật không may. Nếu IP cố gắng xác thực không nằm trong danh sách trắng, mật khẩu phải được nối với mã thông báo bảo mật của người dùng, đây không phải là tùy chọn cho ứng dụng của tôi. – sichinumi

+0

Đặt nó mặc dù proxy của bạn sẽ được đưa vào danh sách cho phép. Cộng với liên kết là 'POST'ed - vì vậy các tham số yêu cầu sẽ được mã hóa bằng HTTPS. Bạn có bất kỳ vấn đề với cách tiếp cận này? –

+0

Hmm, tôi không nghĩ đến việc ủy ​​quyền nó. Tuy nhiên, tôi đang phát triển ứng dụng này cho những người dùng khác trong môi trường kinh doanh khác và định tuyến tất cả lưu lượng truy cập thông qua proxy của bên thứ ba không phải là một tùy chọn. Tôi cũng không có quyền kiểm soát các danh sách trắng cho các tổ chức khác nhau của người dùng. Cuối cùng, tôi đã được các nhà phát triển API thông báo rõ ràng để tránh luồng OAuth Người dùng-Mật khẩu. Tuy nhiên, tôi không có vấn đề gì với nó, nhưng hãy xem câu trả lời khác của tôi và cho tôi biết bạn nghĩ gì về nó. :) – sichinumi

0

Bạn có thể sử dụng thư viện DotNetOpenAuth. Có một ví dụ sử dụng WPF, nơi nó sử dụng một điều khiển winforms có tên là ClientAuthorizationView được cung cấp bởi thư viện DotNetOpenAuth.

Đây là điều khiển lưu trữ trình duyệt cho phép người dùng ủy quyền ứng dụng mà không phải rời khỏi ứng dụng.

Hy vọng trợ giúp này.

Trân trọng

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