2009-10-21 13 views
7

Kann mir jemand sagen, wie man Server Domain Name in asp.net bekommen? (Environment.UserDomainName gibt "IIS APPPOOL" zurück)Wie bekomme ich Server Domain Name

Danke für Wiederholungen, aber meistens sind sie über DNS-Name des Servers, was ich brauche, ist der Domain-Name. Zum Beispiel, wenn ich über Windows-Authentifizierung anmelden Typ I \ Benutzerdomäne und ich brauche dieses „Domain“

+0

Die Domain von welchem ​​Login? Deine? Werden Sie immer eingeloggt sein? IIS hat normalerweise seine eigene separate Anmeldung, unter der es ausgeführt wird, die - wie Sie festgestellt haben - in der Domäne "IIS APPPOOL" ist. – Tinister

Antwort

3

Es sieht für mich aus, als ob Sie versuchen, den Domain-Namen des Benutzers zu finden. Da Sie nach dem Environment.UserDomainName fragen. Da Ihre Website wahrscheinlich mit "Anonymen Zugriff zulassen" ausgeführt wird, gibt der Benutzer seine Domäneninformationen nicht an den Server weiter, und IIS gibt Ihnen die Kontoinformationen, die es hat, nämlich den App-Pool-Account.

1

die System.Net.Dns Klasse Versuchen Sie, es hat viele hilfreiche Methoden wie GetHostEntry dh:

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

Also dann denke ich, die nächste Frage ist, wie erhalten Sie die WAN IP Ihres Servers? Und was ist mit dem Szenario, in dem Sie Shared Hosting verwenden und daher keine IP für Ihre Domain haben? – Tinister

+0

Ich muss verstanden haben "Server Domain Name", Server, im Plural bedeutet für mich, dass Sie irgendwie Domain Name Abfragen durchführen möchten. –

9

Sie über müssen sie aus dem Request-Objekt extrahieren:

HttpContext.Current.Request.Url.Host 
+0

+1: das ist der sauberste Weg. Es gibt nur den Domain-Namen zurück und filtert Ports, http/https, Pfad, Querystring, etc. –

+0

Nun, es gibt den Domain-Namen zurück, der für den Zugriff auf den Server verwendet wird, das ist wahrscheinlich in Ordnung, aber es kann einer von vielen verschiedenen Namen sein Zugriff auf den Server. –

2

es besonderes Problem auf Ihre Frage ist, kann es mehr als ein Domain-Name für eine bestimmte IP-Adresse.

Wie Tinister erwähnt, können Sie

HttpContext.Current.Request.Url.Host 

verwenden Aber das wird Ihnen nur sagen, was der Benutzer in der Adressleiste des Browsers geschrieben. Wenn der Benutzer der Host-Datei für Ihre Site einen Eintrag hinzugefügt hat und diesen Host-Namen verwendet, wird dies angezeigt. (Ich habe keine Ahnung, warum sie das tun würden).

Wenn Sie mehr als einen Domänennamen für Ihre Website haben, können Sie anhand dieser Informationen herausfinden, welche der Domänennamen der Benutzer angefordert hat.

+0

Typische Shared- und Reseller-Hosting-Unternehmen verwenden dieselbe Box für mehrere Kunden und konfigurieren daher ihre Webserver so, dass sie basierend auf dem Hostnamen die richtige Site auswählen. Wenn jemand seine Host-Datei geändert hat, um den Code auf diese Weise zu täuschen, ist es wahrscheinlich, dass der Webserver die Anfrage aufgrund des unbekannten Hostnamens im Voraus ablehnt. Obwohl ich zugeben muss, dass ich das nie wirklich versucht habe ... – Tinister

+0

Das ist wahr; Ich arbeitete für eine Firma, in der der gleiche IIS-Server mehrere Domain-Namen auf diese Weise bewirtete. Ich möchte lediglich darauf hinweisen, dass Sie durch die Überprüfung der "Host" -Eigenschaft erhalten, was der Benutzer eingegeben hat, und es gibt keine Garantie, dass dies tatsächlich ein korrekter Wert ist. – Pete

3

Wenn jemand hier tatsächlich für den Domain-Namen des Servers suchen, hier ist ein Hack, den ich seit den Anfängen .Net verwendet haben:

[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; 
    } 

Sie können ein bisschen info tatsächlich greifen aus Dort. Update: Arbeitet jetzt mit 64 Bit.

Thanks Duncan for the 64bit version.

0

in der web.config müssen Sie das Stück Code

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

    <identity impersonate="true"/> 
+2

Willkommen bei Stack Overflow! Können Sie Ihre Antwort bitte editieren, um eine Erklärung zu geben, warum dieser Code die Frage beantwortet? Code-only-Antworten werden [entmutigt] (http://meta.stackexchange.com/questions/148272), weil sie die Lösung nicht lehren. – DavidPostill

3

Ein bisschen spät hinzuzufügen ..Aber die fehlende und beste Antwort, die ich habe festgestellt, nachdem er genau das gleiche Problem:

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

Wie auf der Msdn erklärte site:

Dieser Rückgabewert ist unabhängig von den Domänenanmeldeinformationen, unter denen die Anwendung wird ausgeführt. Diese Methode ruft die Domäne des Computers ab, unabhängig von den Anmeldeinformationen der vertrauenswürdigen Kontendomäne, unter der sie ausgeführt wird .

Getestet auf meinem persönlichen PC (keine AD-Domäne) und bei der Arbeit (mit AD-Domäne) unter IIS (anonymer Zugriff).