2011-09-29 32 views
6

Tôi đang cố truy cập máy chủ TFS của mình theo chương trình từ bên ngoài miền nơi máy chủ được cài đặt. Một chương trình thử nghiệm cơ bản sẽ trông như thế này:Truy cập theo chương trình vào TFS 2010 từ bên ngoài miền

class Program 
    { 
     static void Main(string[] args) 
     { 
      Uri tfsUri = new Uri("<serverUri>"); 
      TfsConfigurationServer _ConfigurationServer = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri); 
      CatalogNode projectCollectionCatalog = _ConfigurationServer.CatalogNode.QueryChildren(new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None)[0]; // actual connection tries to happen here 
     } 
    } 

Một phiên bản, với các thông tin bắt buộc:

class Program 
    { 
     static void Main(string[] args) 
     { 
      Uri tfsUri = new Uri("<serverURI>"); 
      TfsConfigurationServer _ConfigurationServer = new TfsConfigurationServer(tfsUri, new NetworkCredential("<DifferentKindOfUsernames>", "<Password>")); 
      CatalogNode projectCollectionCatalog = _ConfigurationServer.CatalogNode.QueryChildren(new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None)[0]; 
     } 
    } 

phiên bản khác với một sự pha trộn của cả hai phiên bản trước:

public class ConnectByImplementingCredentialsProvider : ICredentialsProvider 
    { 
     public ICredentials GetCredentials(Uri uri, ICredentials iCredentials) 
     { 
      return new NetworkCredential("<DifferentKindOfUsernames>", "<Password>", "<DomainOrNot>"); 
     } 

     public void NotifyCredentialsAuthenticated(Uri uri) 
     { 
      throw new ApplicationException("Unable to authenticate"); 
     } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      string _myUri = @"<serverUri>"; 

      ConnectByImplementingCredentialsProvider connect = new ConnectByImplementingCredentialsProvider(); 
      ICredentials iCred = new NetworkCredential("<DifferentKindOfUsernames>", "<Password>", "<DomainOrNot>"); 
      connect.GetCredentials(new Uri(_myUri), iCred); 

      TfsConfigurationServer configurationServer = 
           TfsConfigurationServerFactory.GetConfigurationServer(new Uri(_myUri), connect); 
      configurationServer.EnsureAuthenticated(); 


     } 
    } 

Và một phiên bản với một thư mục hoạt động Impersonator:

class Program 
    { 
     static void Main(string[] args) 
     { 
      using (new Impersonator("<DifferentKindOfUsernames>", "<DomainOrNot>", "<Password>")) 
      { 
       Uri tfsUri = new Uri("<serverUri>"); 
       TfsConfigurationServer _ConfigurationServer = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri); 
       CatalogNode projectCollectionCatalog = _ConfigurationServer.CatalogNode.QueryChildren(new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None)[0]; // actual connection tries to happen here 
      } 
     } 
    } 

serverURI đang ở dạng http://<servername>:8080/tfs hoặc http://<serverip>:8080/tfs (cả hai được kiểm tra, với tệp lưu trữ được cập nhật) là những gì được đặt làm URL thông báo trên máy chủ TFS. Chương trình này hoạt động bên trong miền.

DifferentKindOfUsernames là bất kỳ thứ gì từ 'DOMAIN \ Username', 'LocallyDuplicatedUsername', 'LOCALMACHINE \ Username' bằng mật khẩu thích hợp, mật khẩu giống nhau trong miền và trên máy.

truy cập đơn giản này sẽ không hoạt động bên ngoài của tên miền, và tôi có lỗi này:

TF30063: You are not authorized to access <serverUri> 

dịch trong một bối cảnh web (sử dụng quá trình tương tự trong một trang web asp.net), nó là một 401 lỗi:

The remote server returned an error: (401) Unauthorized. 

ngay cả khi (những thứ thử nghiệm cho đến nay):

  • tôi có một ánh xạ giữa các người dùng cục bộ/mật khẩu người chạy s chương trình trên máy bên ngoài miền và tài khoản thư mục hoạt động có quyền truy cập quản trị vào TFS (ngay cả với quyền mạo danh trên TFS được kích hoạt).
  • Tôi thêm một khóa đăng ký BackConnectionNames với tên máy bên ngoài tên miền và ip như được mô tả here.
  • Tôi vô hiệu hóa kiểm tra vòng lặp như mô tả here.
  • Tôi sử dụng Trình mạo danh thư mục hoạt động với sự kết hợp khác nhau của tên người dùng/tên miền hoặc tên máy. Active Impersonator được mô tả here.
  • Tôi đã thêm IP máy chủ TFS vào vùng Internet cục bộ (cũng đã sử dụng trang web đáng tin cậy) trong các tùy chọn bảo mật của máy chủ bên ngoài IE như được mô tả here.

Tôi đã kiểm tra quyền truy cập vào serverURI từ trình duyệt. Các uri hoạt động và tôi có quyền truy cập vào Bộ sưu tập TFS nếu tôi cung cấp thông tin đăng nhập với DomainName \ User + Mật khẩu. Tôi đã thử nghiệm điều này trước bất kỳ sửa đổi nào mà tôi đã mô tả trước đó. Tôi tự hỏi điều gì có thể là sự khác biệt giữa truy cập có lập trình và truy cập trình duyệt bên cạnh tất cả những điều tôi đã thử nghiệm cho đến nay.

+0

Bạn vẫn không có quyền truy cập vào máy chủ TFS từ máy bạn hiện đang chạy mã này. Bạn cần kiểm tra bất kỳ cài đặt bảo mật/quyền bổ sung nào trong TFS. Tôi không tin rằng đây là một vấn đề lập trình. – qJake

+0

@SpikeX: Tôi có quyền truy cập vào TFS Server từ máy. Tôi đã mở các cổng được yêu cầu và có quyền truy cập vào URI thông qua trình duyệt web có cùng thông tin đăng nhập mà tôi đã sử dụng với một Trình mạo danh. Nếu ứng dụng web hoạt động, tôi mong đợi chương trình của tôi sẽ thực hiện tương tự, nhưng không. Tôi có thể xem thông tin sẽ được chương trình của tôi lấy ra nếu nó có thể kết nối (Bộ sưu tập và Danh sách dự án). Tôi có thể thấy lý do tại sao nó bị mờ giữa một lỗi lập trình (thiếu hoặc khởi tạo ủy nhiệm sai) và lỗi mạng/máy chủ (vấn đề cấu hình). – Matthieu

+0

Sau đó câu hỏi ngu ngốc tiếp theo của tôi là, URI của bạn chứa 'http: //' và một số cổng, đúng không? – qJake

Trả lời

4

Bạn không chuyển thông tin đăng nhập để tạo kết nối. Điều này có nghĩa là bạn đang sử dụng thông tin xác thực đăng nhập hiện tại của mình từ máy chủ bên ngoài miền.Tôi không phải là chuyên gia về Windows Authentication, nhưng tôi nghĩ rằng điều này có thể, trong một số trường hợp, làm việc một cách minh bạch (nếu tên người dùng và mật khẩu giống hệt nhau) nhưng dường như phụ thuộc vào phiên bản NTLM đang được sử dụng, hệ điều hành máy khách và máy chủ , các mối quan hệ tin cậy và các khu an ninh, cấu hình IIS và có lẽ là giai đoạn của mặt trăng.

Nói cách khác, có thể bạn muốn vượt qua các chứng chỉ để kết nối:

TfsConfigurationServer _ConfigurationServer = new TfsConfigurationServer(uri, new NetworkCredential("username", "password", "DOMAIN")); 

Lưu ý rằng nó khuyến khích mạnh mẽ để kích hoạt SSL/TLS nếu bạn đang kết nối với máy chủ của bạn trên một không tin cậy (công cộng) mạng.

(tôi sửa chữa này để sử dụng các nhà xây dựng ba-arg cho NetworkCredential -. Sai lầm của tôi Như các bạn lưu ý, nếu bạn đặt DOMAIN\username trong đối số tên người dùng để NetworkCredential, nó sẽ đối xử với nó như \DOMAIN\username thay vì DOMAIN\username này, tôi. giả sử, tại sao không ai cho phép tôi viết mã C#.)

+0

Vẫn không hoạt động. Có nhiều cách để mạo danh người dùng cho TFS và tôi đã thử nghiệm một vài trong số họ mà không thành công. Điều này cung cấp cho cùng một lỗi TF30063. Tôi sẽ cập nhật câu hỏi của mình để trình bày các phiên bản mã khác nhau mà tôi đã thử nghiệm cho đến nay. – Matthieu

+0

Cảm ơn bạn đã chỉnh sửa, điều này rõ ràng hơn nhiều. Trong tò mò, điều gì xảy ra nếu bạn gọi tfs.ensureAuthenticated() thay vì cố truy vấn dữ liệu danh mục? Tôi cho rằng bạn vẫn gặp lỗi? –

+0

Vâng Đó là lỗi tương tự. Tôi đã làm một số phân tích mạng. Tôi sẽ trả lời bình luận của bạn với kết quả. – Matthieu

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