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.
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
@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
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