2009-10-21 92 views
7

有谁能告诉我如何在asp.net中获取服务器的域名? (Environment.UserDomainName返回“IIS APPPOOL”字符串)如何获取服务器域名

感谢重播,但主要是关于DNS名称的服务器,我需要的是域名。例如,当我通过Windows身份验证登录我键入域\用户,我需要这个“域”

+0

其中登录的域名?你的位置?你是否总是要登录? IIS通常拥有自己独立的登录名,它将在“IIS APPPOOL”域中运行,正如您发现的那样。 – Tinister 2009-10-21 15:08:58

回答

3

它看起来像我正在试图找到用户的域名。由于您要求提供Environment.UserDomainName。由于您的网站可能使用“允许匿名访问”运行 - 用户未将其域信息传递给服务器,并且IIS向您提供其具有的帐户信息,即应用程序池帐户。

1

尝试System.Net.Dns类,它有足够的有用的方法,如GetHostEntry即:

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

那么我想下一个问题是如何获得服务器的WAN IP?那么您使用共享主机的情况如何,因此没有专用于您的域的IP? – Tinister 2009-10-21 14:31:47

+0

我一定误解了“服务器域名”,服务器,复数对我来说意味着你想要执行域名查询。 – 2009-10-22 15:25:29

9

你需要将其从请求对象中提取出来:

HttpContext.Current.Request.Url.Host 
+0

+1:这是最干净的方式。它只是返回域名,过滤出端口,HTTP/HTTPS,路径,查询字符串等。 – 2009-10-21 14:42:32

+0

好吧,它返回用于访问服务器的域名,这可能很好,但它可以是许多不同名称之一,用于访问服务器。 – 2009-10-22 15:23:26

2

对于您的问题存在特定问题,可能存在特定IP地址的多个域名。

由于Tinister说,你可以使用

HttpContext.Current.Request.Url.Host 

但是,这只会告诉你什么是用户在浏览器的地址栏中写道。如果用户向您的站点的主机文件添加了一个条目,然后使用该主机名称,那么您将看到。 (我不知道他们为什么会这么做)。

如果您的网站有多个域名,可以使用它来确定用户请求的域名。

+0

典型的共享和经销商托管公司为多个客户使用相同的方框,因此将根据主机名称配置其Web服务器以选择正确的站点。如果有人更改了他们的主机文件来试图以这种方式欺骗代码,那么Web服务器可能会因未知的主机名称而提前拒绝该请求。虽然我承认我从来没有尝试过这样做...... – Tinister 2009-10-21 14:54:11

+0

这是真的;我曾在一家公司工作,在这家公司里,同样的IIS服务器以这种方式托管了几个域名我只是指出,通过检查“主机”属性,您可以获得用户输入的内容,并且不能保证这确实是一个正确的值。 – Pete 2009-10-22 06:28:54

3

如果有人在这里实际上是搜索的服务器的域名,这里是我一直在使用一劈由于.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; 
    } 

实际上,你可以从抢位信息的那里。更新:现在适用于64位。

Thanks Duncan for the 64bit version.

0
在web.config

你需要添加一段代码

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

    <identity impersonate="true"/> 
+2

欢迎来到Stack Overflow!你能否请你的答案给出解释为什么这个代码回答这个问题?仅限代码答案[不鼓励](http://meta.stackexchange.com/questions/148272),因为他们没有教导解决方案。 – DavidPostill 2015-03-25 08:16:42

3

有点晚了..但失踪,最好的答案,我发现,有完全相同的问题后:

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

由于在MSDN site说:

此返回值是独立的域凭据在其下 的应用程序运行。此方法将检索计算机的域名 ,而不管其运行的受信任帐户域凭证是否在 之下。

在IIS(匿名访问)下测试我的个人电脑(无AD域)和工作(与AD域)。