2009-10-21 59 views
7

Ai có thể cho tôi biết làm thế nào để có được tên miền máy chủ trong asp.net? (Environment.UserDomainName trả về "IIS APPPOOL" chuỗi)Làm thế nào để có được tên miền máy chủ

Cảm ơn bạn đã phát lại, nhưng chủ yếu là về tên DNS của máy chủ, những gì tôi cần là tên miền. Ví dụ khi tôi đăng nhập qua cửa sổ xác thực Tôi gõ domain \ user và tôi cần điều này "miền"

+0

Miền đăng nhập nào? Của bạn? Bạn có luôn luôn được đăng nhập không? IIS thường có thông tin đăng nhập riêng của nó mà nó chạy dưới, mà - như bạn đã khám phá - nằm trong miền "IIS APPPOOL". – Tinister

Trả lời

3

Có vẻ như tôi đang cố gắng tìm tên miền của người dùng. Vì bạn đang yêu cầu Environment.UserDomainName. Vì trang web của bạn có khả năng chạy với "Cho phép truy cập vô danh" - người dùng không chuyển thông tin miền của họ tới máy chủ và IIS cung cấp cho bạn thông tin tài khoản mà nó có, cụ thể là tài khoản ứng dụng.

1

Thử lớp System.Net.Dns, nó có rất nhiều phương pháp hữu ích như GetHostEntry ví dụ:

var entry = System.Net.Dns.GetHostEntry("google.com"); // or vice-versa... 
var name = System.Net.Dns.GetHostEntry("127.0.0.1"); // localhost ;) 
+1

Vì vậy, sau đó tôi đoán câu hỏi tiếp theo là làm thế nào để bạn nhận được IP WAN của máy chủ? Và điều gì về kịch bản mà bạn đang sử dụng chia sẻ lưu trữ và do đó không có một IP dành riêng cho tên miền của bạn? – Tinister

+0

Tôi phải hiểu lầm "máy chủ tên miền", máy chủ, số nhiều có nghĩa là với tôi rằng bằng cách nào đó bạn muốn thực hiện truy vấn tên miền. –

9

Bạn sẽ cần trích xuất nó từ đối tượng yêu cầu:

HttpContext.Current.Request.Url.Host 
+0

+1: đây là cách sạch nhất. Nó chỉ trả về tên miền, lọc ra các cổng, http/https, đường dẫn, truy vấn, vv –

+0

Vâng, nó trả về tên miền được sử dụng để truy cập vào máy chủ, điều đó có thể tốt, nhưng nó có thể là một trong nhiều tên khác nhau được sử dụng để truy cập máy chủ. –

2

Có vấn đề cụ thể đối với câu hỏi của bạn, có thể có nhiều hơn một tên miền cho một địa chỉ IP cụ thể.

Như Tinister nói, bạn có thể sử dụng

HttpContext.Current.Request.Url.Host 

Nhưng đó sẽ chỉ cho bạn biết những gì người dùng đã viết vào thanh địa chỉ của trình duyệt. Nếu người dùng đã thêm một mục nhập vào tệp lưu trữ của họ cho trang web của bạn và sau đó sử dụng tên máy chủ đó, đó là những gì bạn sẽ thấy. (Tôi không biết tại sao họ lại làm thế).

Nếu bạn có nhiều tên miền cho trang web của mình, bạn có thể sử dụng tên đó để tìm ra tên miền nào người dùng đã yêu cầu.

+0

Các công ty lưu trữ và chia sẻ đại lý điển hình sử dụng cùng một hộp cho nhiều khách hàng và do đó sẽ định cấu hình máy chủ web của họ để chọn trang web chính xác dựa trên tên máy chủ lưu trữ. Nếu ai đó thay đổi tệp lưu trữ của họ để thử và đánh lừa mã theo cách này, có khả năng máy chủ web sẽ từ chối yêu cầu trả trước do tên máy chủ không xác định. Mặc dù tôi thừa nhận tôi đã không bao giờ thực sự cố gắng làm điều này ... – Tinister

+0

Đó là sự thật; Tôi đã làm việc cho một công ty có cùng một máy chủ IIS lưu trữ một số tên miền trong thời trang này. Tôi chỉ đơn thuần chỉ ra rằng bằng cách kiểm tra thuộc tính "Host" bạn có được những gì người dùng đã nhập vào, và không có gì đảm bảo rằng đây thực sự là một giá trị đúng. – Pete

3

Nếu ai ở đây đang thực sự tìm kiếm cho tên miền của máy chủ, đây là một hack Tôi đã sử dụng kể từ khi khởi đầu Net:

[DllImport("netapi32.dll", CharSet = CharSet.Auto)] 
    static extern int NetWkstaGetInfo(string server, int level, out IntPtr info); 

    [DllImport("netapi32.dll")] 
    static extern int NetApiBufferFree(IntPtr pBuf); 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] 
    class WKSTA_INFO_100 
    { 
     public int wki100_platform_id; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string wki100_computername; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string wki100_langroup; 
     public int wki100_ver_major; 
     public int wki100_ver_minor; 
    } 

    public static string GetMachineNetBiosDomain() 
    { 
     IntPtr pBuffer = IntPtr.Zero; 

     WKSTA_INFO_100 info; 
     int retval = NetWkstaGetInfo(null, 100, out pBuffer); 
     if (retval != 0) 
      throw new Win32Exception(retval); 

     info = (WKSTA_INFO_100)Marshal.PtrToStructure(pBuffer, typeof(WKSTA_INFO_100)); 
     string domainName = info.wki100_langroup; 
     NetApiBufferFree(pBuffer); 
     return domainName; 
    } 

Bạn thực sự có thể lấy một chút thông tin từ đó. Cập nhật: Bây giờ làm việc với 64 bit.

Thanks Duncan for the 64bit version.

0

trong web.config bạn cần phải thêm đoạn mã

<authentication mode="Windows"/> 
    <authorization> 
     <deny users="?"/> 
    </authorization> 

    <identity impersonate="true"/> 
+2

Chào mừng bạn đến với Stack Overflow! Bạn có thể vui lòng [sửa] câu trả lời của bạn để giải thích tại sao mã này trả lời câu hỏi? Các câu trả lời chỉ có mã được [nản lòng] (http://meta.stackexchange.com/questions/148272), bởi vì chúng không dạy giải pháp. – DavidPostill

3

Một hơi muộn ..Nhưng câu trả lời còn thiếu và tốt nhất mà tôi đã tìm thấy, sau khi có chính xác cùng một vấn đề:

private static string getComputerDomain() 
     { 
      try 
      { 
       return Domain.GetComputerDomain().Name; 
      } 
      catch (ActiveDirectoryObjectNotFoundException) 
      { 
       return "Local (No domain)"; 
      } 
     } 

Như đã nêu trên MSDN site:

giá trị

trở lại này không phụ thuộc vào thông tin tên miền, theo đó sự ứng dụng đang chạy. Phương pháp này sẽ truy xuất tên miền của máy tính bất kể thông tin xác thực tên miền tài khoản đáng tin cậy của nó là chạy dưới.

Thử nghiệm trên máy tính cá nhân của tôi (không có miền AD) và tại nơi làm việc (có miền AD) trong IIS (truy cập ẩn danh).

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