2013-01-24 30 views
7

Tôi hiện đang tìm kiếm giải pháp tốt cho vấn đề ở trên. Có lẽ chúng tôi sẽ chạy xác thực biểu mẫu trên .NET.Đăng nhập một lần với 2 tên miền phụ, một Java, một .NET

Tôi có ứng dụng ASP.NET MVC chạy trên a.mydomain.com và ứng dụng dựa trên Java chạy trên b.mydomain.com.

Cách tiếp cận tốt nhất để tôi không phải đăng nhập vào từng ứng dụng là gì. Nói, khi tôi đăng nhập vào a.mydomain.com và sau đó mở Java b.mydomain.com, và nó sẽ kiểm tra và thấy rằng tôi đã đăng nhập?

Lớp WCF AuthenticationService có hoạt động cho điều này không? Tôi có thể thực hiện yêu cầu AJAX từ JavaScript của b.mydomain.com để kiểm tra xem tôi đã đăng nhập đã có trong ứng dụng .NET chưa?

Trả lời

2

Chừng nào mydomain.com không nằm trong danh sách hậu tố công khai (http://publicsuffix.org/list/), a.mydomain.com có thể đặt một cookie miền với .mydomain.com

(lưu ý rằng bạn chỉ có thể đi xuống một cấp trong việc đưa cookie: a.b.mydomain.com không thể đặt một .mydomain.com cookie)

Cookie sẽ được gửi đến b.mydomain.com (cũng như *.mydomain.commydomain.com) và có thể được sử dụng làm mã thông báo để mở phiên. Vì vậy, hãy chắc chắn để kiểm soát toàn bộ * .mydomain.com subdomain và làm cho nó HttpOnly và bảo đảm (https)

Response.SetCookie(new HttpCookie("myCookieName", "myCookieValue") { HttpOnly = true, Domain = ".myDomain.com", Secure=true }); 

Một số phần của giải pháp Atlassian đám đông http://www.atlassian.com/software/crowd/overview được dựa trên cơ chế cookie này

Vì vậy, bạn có thể :

  1. Bật xác thực biểu mẫu trên a.domain.com
  2. khi đăng nhập thành công xây dựng một cookie myToken mà giá trị chứa userId và băm userId với phím băm được biết đến bởi a.myDomain.com và b.myDomain.com
  3. thiết lập các cookie với miền .mydomain.com
  4. khi dùng nhập b.myDomain.com, kiểm tra phía máy chủ cookie (trong java) cho phù hợp giữa userId và giá trị băm
  5. nếu cookie là đúng, phiên mở cho người dùng userId

Lưu ý rằng bạn sẽ không có thể truy cập vào phía máy khách cookie (vì vậy không xử lý cookie js, trừ khi tôi t là js phía máy chủ, ví dụ: nodejs)

+0

vì vậy tôi có thể bật xác thực biểu mẫu trên .NET .. và sau đó cookie sẽ tự động được chuyển sang tên miền phụ khác? :/ và sau đó họ chỉ cần kiểm tra xem cookie đó có tồn tại trong javascript không ??? Tôi có cách nào ở đây không? Và điều này sẽ không quá tệ? và mở để tấn công ?? –

+0

@NeilHosey Tôi đã chỉnh sửa câu trả lời của mình. Hy vọng điều này sẽ giúp – jbl

+0

Nhưng b.mydomain.com có ​​thể xác định người dùng nào thực sự đã đăng nhập không? có nên lưu trữ dữ liệu này trong cookie không? cùng với thông tin tự động hóa để truy cập vào các phần của hệ thống? –

1

Sử dụng giải pháp Java hoặc .NET hiện tại không có khả năng hoạt động trên nền tảng khác. Bạn cần một số khả năng:

  1. Theo dõi khách hàng bằng mã định danh để nhận dạng (phiên, cookie).
  2. Yêu cầu cả ứng dụng Java và .NET đều có thể nhận được thông tin liên quan.

Bạn có thể làm như thế nào?

  1. Điều này thực sự khá dễ dàng. Bạn đang sử dụng cùng một tên miền để bạn có thể đặt cookie trên trình duyệt cho tất cả các miền, có nghĩa là các yêu cầu tới * và b * đều sẽ có cookie được gửi đến máy chủ. Cả Java và .NET đều có các tiện ích tuyệt vời cho việc sắp xếp cookie.
  2. Điều này phụ thuộc vào back-end của bạn. Các hệ thống sử dụng lưu trữ liên tục là gì? Nếu bạn có một cái gì đó giống như một cơ sở dữ liệu MySQL mà cả hai hệ thống được kết nối với, bạn có thể tạo một bảng với thông tin đăng nhập cho mỗi định danh được lưu trữ để xác thực. Nếu bạn thực hiện tuyến đường này, có một số loại thời gian chờ để làm mất hiệu lực xác thực cũ.

Nếu bạn có cả hai thông tin đó, bạn có thể thực hiện xác thực trên từng hệ thống.

1

Tôi khuyên bạn nên sử dụng một trong các giao thức sso doanh nghiệp, liên kết Oauth2 hoặc ws. Điều này mang lại cho bạn sự linh hoạt tối đa trong việc soạn các dịch vụ của mình, bạn không chỉ có thể liên kết hai dịch vụ này, nhưng sau đó, dễ dàng mở rộng môi trường ứng dụng của bạn. Cả hai giao thức đều không cần các ứng dụng trên cùng một miền.

Mặc dù điều này nghe có vẻ quá phức tạp cho nhu cầu đơn giản của bạn, bạn làm điều đó một lần và giải quyết vấn đề sso mãi mãi, bất kể điều gì xảy ra trong tương lai cho các ứng dụng của bạn.

+0

cảm ơn. tôi sẽ nhìn vào chúng. Id thay vì một giải pháp đơn giản mặc dù nó xuất hiện với tôi là một vấn đề đơn giản, tôi chỉ không có kiến ​​thức trong lĩnh vực này –

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