2011-02-07 32 views
11

Trong khi kêu gọi một dịch vụ web tôi nhận được lỗi sau:Yêu cầu HTTP không được cho phép với cơ chế thẩm định khách hàng NTLM '

The HTTP request is unauthorized with client authentication scheme 'NTLM'. The authentication header received from the server was 'NTLM'. The HTTP request is unauthorized with client authentication scheme 'NTLM'. The authentication header received from the server was 'NTLM'.

Tôi có một 4 ứng dụng Silverlight mà các cuộc gọi một dịch vụ web WCF, cả trên IIS của tôi (7). dịch vụ web WCF của tôi gọi một dịch vụ web ASMX khác, được cài đặt trên một máy chủ web khác, sử dụng NTLM (Xác thực Windows). Cả hai máy chủ, máy chủ của tôi và máy chủ lưu trữ dịch vụ web ASMX đều nằm trong cùng một miền.

Khi ứng dụng Silverlight mở ứng dụng từ máy chủ sử dụng http://localhost/MySiteName mọi thứ hoạt động tốt. Nhưng khi ứng dụng Silverlight mở ứng dụng từ một ứng dụng khách khác, không phải máy chủ nhưng vẫn nằm trong cùng một miền, sử dụng http://MyServerName/MySiteName thì tôi sẽ gặp lỗi.

Xác thực Windows được bật trong IIS của tôi. Xác thực ẩn danh bị tắt trong IIS của tôi.

Binding cấu hình để gọi dịch vụ web WCF của tôi là:

<binding name="winAuthBasicHttpBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 

cấu hình Binding để gọi dịch vụ web ASMX là:

<binding name="ClNtlmBinding"> 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Ntlm" /> 
     </security> 
    </binding> 
+0

Cấu hình ràng buộc để gọi dịch vụ web WCF của tôi là : cấu hình Binding để gọi dịch vụ web ASMX là: kruvi

Trả lời

18

OK, sau đây là những điều mà đi vào tâm trí:

  • Dịch vụ WCF của bạn có lẽ đang chạy trên IIS phải đang chạy trong ngữ cảnh bảo mật có đặc quyền tha t gọi Dịch vụ Web. Bạn cần đảm bảo trong hồ bơi ứng dụng với người dùng là người dùng miền - lý tưởng là người dùng chuyên dụng.
  • Bạn không thể sử dụng mạo danh sử dụng thẻ bảo mật của người dùng để vượt qua trở lại ASMX sử dụng mạo danh từ my WCF web service calls another ASMX web service, installed on a **different** web server
  • Hãy thử thay đổi Ntlm để Windows và kiểm tra một lần nữa.

OK, một vài từ về mạo danh. Về cơ bản, đó là một vấn đề đã biết mà bạn không thể sử dụng mã thông báo mạo danh mà bạn nhận được cho một máy chủ, để chuyển sang máy chủ khác. Lý do có vẻ là mã thông báo là một loại băm sử dụng mật khẩu của người dùng và hợp lệ đối với máy được tạo ra do đó nó không thể được sử dụng từ máy chủ trung gian.


CẬP NHẬT

Phái đoàn có thể dưới WCF (mạo danh nghĩa là chuyển tiếp từ một máy chủ đến máy chủ khác). Xem chủ đề này here.

+0

Cảm ơn. Khi tôi đặt người dùng miền vào nhóm ứng dụng, nó hoạt động tốt, nhưng bây giờ tất cả các cuộc gọi của tôi tới WS được thực hiện dưới người dùng miền ứng dụng của nhóm. Tôi không thể gọi các ASMX bằng cách sử dụng mạo danh, vì vậy cuộc gọi được thực hiện theo mã thông báo bảo mật người dùng của khách hàng? – kruvi

+0

BTW, tôi quên đề cập đến rằng khi sử dụng mạo danh với một người dùng cụ thể (cùng một người dùng đăng nhập vào máy khách) mọi thứ hoạt động tốt: client = new ClCustomersServiceClient(); client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; client.ClientCredentials.Windows.ClientCredential = new NetworkCredential ("tên người dùng", "mật khẩu", "tên miền"); phản hồi = khách hàng.ClCustomersQuery (yêu cầu); – kruvi

+0

Tôi đã cập nhật, có giao diện. – Aliostad

7

Đã lâu rồi kể từ khi câu hỏi được đăng, nhưng tôi đã gặp phải vấn đề tương tự trong một kịch bản tương tự. Tôi có một ứng dụng giao diện điều khiển và tôi đã được tiêu thụ một dịch vụ web và máy chủ IIS của chúng tôi, nơi các webservice được đặt có cửa sổ xác thực (NTLM) được kích hoạt.

Tôi đã theo dõi this link và điều đó đã khắc phục được sự cố của tôi.Dưới đây là đoạn code mẫu cho App.config:

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="Service1Soap"> 
       <security mode="TransportCredentialOnly"> 
        <transport clientCredentialType="Ntlm" proxyCredentialType="None" 
         realm=""/> 
        <message clientCredentialType="UserName" algorithmSuite="Default"/> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost/servicename/service1.asmx" 
      binding="basicHttpBinding" bindingConfiguration="ListsSoap"/> 
    </client> 
</system.serviceModel> 
0

1) tôi phải làm như sau với cấu hình của tôi: (Thêm BackConnectionHostNames hoặc Disable Loopback Kiểm tra) http://support.microsoft.com/kb/896861

2) Tôi đã làm việc ra một hệ thống dev trên một mạng dev bị cô lập. Tôi đã làm cho nó hoạt động bằng tên máy tính của hệ thống dev trong URL tới dịch vụ web, nhưng khi tôi sửa đổi URL thành URL sẽ được sử dụng trong sản xuất (chứ không phải tên máy tính), tôi bắt đầu nhận lỗi NTLM.

3) Tôi nhận thấy nhật ký bảo mật cho thấy tài khoản dịch vụ không đăng nhập được với lỗi tương tự như lỗi trong bài viết MSDN.

4) Thêm BackConnectionHostNames đã tạo nó để tôi có thể đăng nhập vào máy chủ thông qua trình duyệt đang chạy trên máy chủ, nhưng tài khoản dịch vụ vẫn có lỗi NTLM khi cố gắng xác thực cho dịch vụ web. Tôi vết thương lên vô hiệu hóa kiểm tra lại vòng lặp và cố định nó cho tôi.

0

Có thể bạn có thể tham khảo: http://msdn.microsoft.com/en-us/library/ms731364.aspx Giải pháp của tôi là thay đổi 2 thuộc tính authenticationScheme and proxyAuthenticationScheme thành "Ntlm", sau đó hoạt động.

PS: Môi trường của tôi là như sau - phía Server: .net 2.0 ASMX - phía Chủ đầu tư: .net 4

1

tôi đã phải di chuyển miền, tên người dùng, mật khẩu từ

client.ClientCredentials.UserName.UserName = domain + "\\" + username; client.ClientCredentials.UserName.Password = password

để

client.ClientCredentials.Windows.ClientCredential.UserName = username; client.ClientCredentials.Windows.ClientCredential.Password = password; client.ClientCredentials.Windows.ClientCredential.Domain = domain;

2

Đối với tôi giải pháp ngoài việc sử dụng "Ntlm" làm loại chứng chỉ, tương tự như giải pháp của Jeroen K. Nếu tôi có cấp quyền tôi sẽ cộng trên bài đăng của anh ấy, nhưng hãy để tôi đăng toàn bộ mã của tôi tại đây, sẽ hỗ trợ cả Windows và các loại chứng chỉ khác như auth cơ bản:

XxxSoapClient xxxClient = new XxxSoapClient(); 
    ApplyCredentials(userName, password, xxxClient.ClientCredentials); 

    private static void ApplyCredentials(string userName, string password, ClientCredentials clientCredentials) 
    { 
     clientCredentials.UserName.UserName = userName; 
     clientCredentials.UserName.Password = password; 
     clientCredentials.Windows.ClientCredential.UserName = userName; 
     clientCredentials.Windows.ClientCredential.Password = password; 
     clientCredentials.Windows.AllowNtlm = true; 
     clientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 
    } 
Các vấn đề liên quan