2009-06-04 4 views
25

Tôi có dịch vụ WCF bằng cách sử dụng BasicHttpBinding với xác thực Windows. Hầu hết khách hàng là tài khoản miền và kết nối với dịch vụ bằng thông tin đăng nhập mặc định của họ.Cách chỉ định thông tin đăng nhập Windows trong tệp cấu hình máy khách WCF

Bây giờ tôi muốn kết nối với dịch vụ từ máy khách ASP.NET đang chạy trong tài khoản cục bộ. Tôi muốn kết nối với dịch vụ WCF bằng cách sử dụng các thông tin đăng nhập Windows (domain \ user và password) có sẵn cho ứng dụng ASP.NET.

Tôi biết tôi có thể thực hiện việc này bằng mã sử dụng ClientBase < T> .ClientCredentials.

Có cách nào để chỉ định thông tin đăng nhập (tên miền \ người dùng và mật khẩu) trong tệp web.config của ứng dụng khách để tôi không phải thay đổi mã không?

EDIT

Nếu nó không thể được thực hiện trong các tập tin cấu hình, là có một cách sử dụng System.Net.ICredentials hoặc System.Net.NetworkCredential như một chứng chỉ cho một dịch vụ WCF? Một khung công tác .NET cung cấp những cách này như một cách đồng nhất để cung cấp thông tin đăng nhập mạng, nhưng với WCF, điều này dường như đã bị ném ra để ủng hộ một hệ thống không tương thích mới dựa trên lớp System.ServiceModel.Description.ClientCredentials không liên quan.

EDIT 2

Chấp nhận câu trả lời của Marc cho câu hỏi ban đầu - có vẻ như không có cách nào để làm điều này trong tập tin cấu hình máy khách :(

tôi sẽ coi đây là một sự thiếu hụt trong WCF - Tôi không chấp nhận rằng Microsoft nên cố ý ngăn cản chúng tôi đưa thông tin đăng nhập vào tệp cấu hình - sau khi tất cả chúng phải được lưu trữ ở đâu đó và Khung bao gồm các cơ sở để mã hóa tệp cấu hình. , nhưng nó phải có sẵn trong hộp.

Nó cũng có một chút không nhất quán: phần tử cấu hình system.net/mailSettings/smtp/network cho phép xác thực thông tin, vậy tại sao không phải WCF?

Về câu hỏi thứ hai về việc sử dụng System.Net.NetworkCredential, có vẻ như từ this blog rằng nó là có thể, ít nhất là khi sử dụng Windows authentication, với đoạn mã sau:

factory.Credentials.Windows.ClientCredential = 
    new System.Net.NetworkCredential(name, password, domain); 

Trả lời

11

Bạn không thể chỉ của bạn thông tin đăng nhập trong tập tin cấu hình, thật không may - bạn phải làm điều này trong mã (rất có thể bởi vì nếu không bạn có thể kết thúc với các thông tin trong tập tin cấu hình của bạn, trong văn bản thuần túy - không phải là một điều tốt ....).

+3

"... trong tập tin cấu hình của bạn, trong văn bản đơn giản" không phải là nói chung là một điều tốt, nhưng trong file config mã hóa là OK. – Joe

+0

@marc_s Nó vẫn không có sẵn để thiết lập thông qua tập tin cấu hình? –

+1

@Johnny_D: không, không xa như tôi biết. –

0

Bạn đã thử điều này chưa?

<system.web> 
     <identity impersonate="true" userName="username" password="password"/> 
</system.web> 
+2

Không có điều này không thực sự hữu ích - máy chủ ASP.NET không đáng tin cậy để ủy quyền. – Joe

4

Tôi hiểu rằng không có một cơ chế để xác định các thông tin trong < ràng buộc > thẻ, nhưng tại sao không làm điều này:

Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"]; 
Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"]; 
+1

sẽ hoạt động - nhưng tôi thực sự khuyên bạn nên mã hóa tệp cấu hình của bạn trong trường hợp này! –

+0

Có, tôi biết tôi có thể làm điều đó trong mã, tôi muốn tránh thay đổi mã. – Joe

+0

Joe - ví dụ của tôi sẽ cho phép bạn sau đó chỉ định tên người dùng và mật khẩu của bạn trong tệp app/web.config vì bạn không thể làm điều đó một cách nguyên bản. – Lewis

18
Svc.ClientCredentials.UserName.UserName = AppSettings["WCFSvcUsername"]; 
Svc.ClientCredentials.UserName.Password = AppSettings["WCFSvcPassword"]; 

là không chính xác.Nó được sử dụng với bảo mật thưclientCredentialType = "Tên người dùng". Bạn nên sử dụng

Svc.ClientCredentials.Windows.ClientCredential = new NetworkCredential(...); 
+0

Tôi không hoàn thành bài đăng của bạn. Bạn đã biết câu trả lời của câu hỏi - xin lỗi. – Steven

+0

Mặc dù đây là một câu hỏi rất cũ, tôi đăng bài này cho bất kỳ ai có cùng một vấn đề. – Steven

+7

Bạn cũng không hoàn thành câu của mình;) – Gagege

1
Svc.ClientCredentials.Windows.ClientCredential = 
    System.Net.CredentialCache.DefaultNetworkCredentials; 
5

Có vẻ như không có cách nào để thiết lập id và mật khẩu trong cấu hình ràng buộc mặc định (tôi vẫn đang tìm kiếm), tôi đã làm nó thêm dưới mã, nhưng vẫn muốn microsoft sẽ thêm nó vào các ràng buộc mặc định

<appSettings> 
    <add key="user" value="user" /> 
    <add key="password" value="password" /> 
    <add key="domain" value="domain" /> 
    </appSettings> 


    // client side code 
    string userName = ConfigurationManager.AppSettings.Get("user"); 
    string pswd = ConfigurationManager.AppSettings.Get("password"); 
    string domain = ConfigurationManager.AppSettings.Get("domain"); 

    client.ClientCredentials.Windows.ClientCredential.Domain = domain; 
    client.ClientCredentials.Windows.ClientCredential.UserName = userName; 
    client.ClientCredentials.Windows.ClientCredential.Password = pswd; 

Sebastian Castaldi