2012-05-02 38 views
10

nhanh ...Mono để SQL Server với Windows Auth

Làm thế nào để sử dụng Windows Authentication để SQL Server với Mono SQL Client chạy trên Windows mà không một tên người dùng + mật khẩu trong chuỗi kết nối?

More ...

  • Chúng ta phải sử dụng Mono để hỗ trợ nhiều nền tảng cho một số thành phần của ứng dụng của chúng tôi
    Đây là một hạn chế bên ngoài mà chúng ta không thể thay đổi

  • Chúng tôi sẽ chạy các thành phần truy cập cơ sở dữ liệu chỉ trên Windows
    Tính năng di động/OS-thuyết bất khả tri của Máy khách SQL đơn không thêm giá trị

Đó là, bất kỳ thành phần chạy trên không phải là Windows sẽ không truy cập vào cơ sở dữ liệu SQL Server

  • Quá trình này chạy theo một số người dùng Windows (sử dụng sản, tài khoản dịch vụ, bất cứ điều gì)

  • Nhúng tên người dùng và mật khẩu là điều xấu
    Bất kể góc nào bạn đến từ

Vì vậy, làm cách nào chúng tôi có thể cho phép Máy khách SQL đơn đọc đọc mã thông báo đăng nhập NT của người dùng đang chạy quy trình và chuyển mã này cho SQL Server? Giống như MS .net làm gì?

  • Có một lá cờ hoặc thiết lập mà không phải là tài liệu tốt

  • Chúng ta cần phải thực hiện phần mở rộng của chúng ta?
    Nếu có, chúng tôi có thực sự là người đầu tiên muốn làm điều này không?

Có 5 câu hỏi khác (hiện tại) tagged Mono và SQL-Server: họ không trả lời này ...

+3

Tôi không có câu trả lời cho bạn, nhưng người ta phải tự hỏi liệu bạn có thể coi AD như máy chủ Kerberos là nó và nhận được một vé để sử dụng cho xác thực của bạn hay không. Đây là một vấn đề thực sự thú vị! –

+0

@BenThul: Chúng tôi sẽ điều tra. Làm cho nó một câu trả lời xin vui lòng: Tôi sẽ upvote. Nó cũng có thể giúp chúng ta giải quyết vấn đề. – gbn

+0

Oh ... Tôi không biết rằng tôi sẽ xem xét những gì tôi có như là một câu trả lời được nêu ra. Tôi chỉ hy vọng nó dẫn đến một. –

Trả lời

9

Đây không phải là dễ dàng để thực hiện như âm thanh. Như tôi chắc chắn rằng bạn đã biết, Mono SqlClient đã hỗ trợ để xác thực NT:

Có một định dạng chuỗi kết nối cho NT Xác thực: Server = hostname; Database = DatabaseName; tài ID = windowsDomain \ windowsUserid; Password = windowsPassword ; Integrated Security = SSPI

Nhưng tất nhiên, bạn muốn hình thức đơn giản của Integrated Security=SSPI và để cho các NT xác thực bắt tay sử dụng các chứng chỉ quy trình hiện hành. Và đây là vấn đề.Trong khi tầm thường để truy xuất tên người dùng hiện tại (danh tính), không thể cho một quá trình để khám phá thông tin đăng nhập riêng của nó mật khẩu. Khi thực hiện xác thực NT một quá trình Windows không thực sự thực hiện xác thực, nhưng thay vào đó là yêu cầu Locas Security Authority (aka. LSASS.EXE, trivia: không đính kèm một trình gỡ lỗi vào nó;)) để xác thực quá trình này. Điều đó có nghĩa là bất kỳ thư viện nào muốn đạt được điều tương tự cũng phải sử dụng cùng một giao thức, nghĩa là. yêu cầu LSA xác thực nó. Các chi tiết thực tế, cho tò mò, nằm trong dãy số AcquireCredentialHandle, InitializeSecurityContext, AcceptSecurityContext như được mô tả trong Using SSPI. Tôi đã không nghiên cứu nguồn mono cho SqlClient, nhưng tôi khá chắc chắn rằng họ sử dụng một số thư viện GSS-API để xác thực, không phải SSPI. do đó, theo định nghĩa, họ yêu cầu phải biết mật khẩu vì họ sẽ thực hiện trao đổi Kerberos mình, không yêu cầu LSA thực hiện thay mặt họ.

Đây là, như bạn có thể nói, suy đoán và đoán thêm về phía tôi, nhưng tôi sẽ ngạc nhiên khi nghe một câu chuyện khác. Trong khi chắc chắn có thể nĩa hoặc vá Mono.Data.Tds và sửa đổi việc triển khai xác thực để sử dụng SSPI thay vì GSS, điều này, theo định nghĩa, là một triển khai Windows không di động cụ thể. Tôi đoán rằng có rất ít động lực cho nó cho rằng điểm thu hút số 1 của Mono là không phải là Windows cụ thể. Tôi e rằng bạn sẽ phải tự mình thực hiện nó.

+0

Chúng ta phải sử dụng Mono vì các lý do khác nhau: nhưng không có tính di động không phải là vấn đề đối với các thành phần kết nối với cơ sở dữ liệu. Và chúng ta có thể tránh mật khẩu trong văn bản rõ ràng nếu chúng ta thực hiện nó – gbn

+0

Tôi không nói rằng nó không có ý nghĩa đối với * bạn *. Tôi đang nói có lẽ không được thực hiện bởi mono. –

+3

@RemusRusanu giải thích là chính xác. Mono không thực hiện ** tích hợp ** mật khẩu-ít kết nối đến máy chủ SQL vì những lý do ông nói. Tất nhiên đây là tất cả mã nguồn mở vì vậy có khả năng có thể thêm nó vào nền tảng không phải Windows. Hãy chắc chắn để chia sẻ phát hiện của bạn với cộng đồng :-) – poupou

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