Was ist der Unterschied zwischen Uri.Host und Uri.Authority?

82

System.Urihat Host, Authorityund DnsSafeHost. MS liefert ein schönes Beispiel dafür, wann Hostund DnsSafeHostsind hier anders .

Ich hätte gerne ein ähnliches Beispiel / eine ähnliche Erklärung für Hostund Authority.

Brian
quelle

Antworten:

103

Ja, Brandon ist absolut richtig, was Laien betrifft

Autorität = Hostname + Port-Nr

Wenn das URL-Protokoll einen Standardport verwendet, z. B. Port 80 für http-URL, dann nur in diesem Fall Authority = Host Name (Port Nr. Wird als 80 angenommen).

Während der Hostname entweder der Domänenname oder die IP-Adresse ist

Beispiel:

  1. http://www.example.com/

    Authority = www.example.com
    Hostname = www.example.com

  2. http://255.255.255.255:8080/

    Autorität = 255.255.255.255:8080
    Hostname = 255.255.255.255

Saurabh Mishra
quelle
1
Ein kleiner Zweifel. Wenn ich die Anwendung in localhost ausführe, habe ich eine Portnummer in meiner URL, aber in der Produktion habe ich keine Portnummer in der URL. Also kann ich Url.Authority frei benutzen, oder? Ich meine, wenn die Portnummer nicht vorhanden ist, verhält sich URl.Authority genauso wie URL.Host rechts. Ich meine, ich werde immer noch in der Lage sein, die URL richtig zu machen, oder? Bitte führen Sie mich,.
Unbreakable
Lesen Sie stackoverflow.com/a/39415643/316343 , es hat das User InformationTeil verpasst .
Jahan
35

Von der MSDN URI.Host- Seite.

Im Gegensatz zur Authority-Eigenschaft enthält dieser Eigenschaftswert nicht die Portnummer.

Kervin
quelle
Ein kleiner Zweifel. Wenn ich die Anwendung in localhost ausführe, habe ich eine Portnummer in meiner URL, aber in der Produktion habe ich keine Portnummer in der URL. Also kann ich Url.Authority frei benutzen, oder? Ich meine, wenn die Portnummer nicht vorhanden ist, verhält sich URl.Authority genauso wie URL.Host rechts. Ich meine, ich werde immer noch in der Lage sein, die URL richtig zu machen, oder? Bitte führen Sie mich.
Unbreakable
@Unbreakable - Richtig, es wird in beiden Fällen funktionieren. Wenn Sie die Portnummer nicht in der URL angeben, verwenden Sie einfach die Standardnummer. In diesem Fall lässt Url.Authority den Port weg.
BornToCode
15

Jede HTTP-URL entspricht der Syntax eines generischen URI. Die generische URI-Syntax besteht aus einer hierarchischen Folge von fünf Komponenten:

URI = scheme:[//authority]path[?query][#fragment]

wobei sich die Berechtigungskomponente in drei Unterkomponenten unterteilt:

authority = [userinfo@]host[:port]

So was:

Wiki

Eine optionale Berechtigungskomponente, der zwei Schrägstriche (//) vorangestellt sind, bestehend aus:

  • Eine optionale Userinfo- Unterkomponente, die aus einem Benutzernamen und einem optionalen Kennwort mit einem Doppelpunkt (:) gefolgt von einem at-Symbol (@) bestehen kann. Die Verwendung des Formats Benutzername: Kennwort in der Unterkomponente userinfo ist aus Sicherheitsgründen veraltet. Anwendungen sollten keine Daten nach dem ersten Doppelpunkt (:) in einer Unterkomponente userinfo als Klartext rendern, es sei denn, die Daten nach dem Doppelpunkt sind leere Zeichenfolgen (ohne Kennwort).
  • Eine optionale Host- Unterkomponente, die entweder aus einem registrierten Namen (einschließlich, aber nicht beschränkt auf einen Hostnamen) oder einer IP-Adresse besteht. IPv4-Adressen müssen in Punkt-Dezimal-Schreibweise angegeben werden, und IPv6-Adressen müssen in Klammern ([]) stehen.
  • Eine optionale Port- Unterkomponente, der ein Doppelpunkt (:) vorangestellt ist.

Weitere Informationen finden Sie unter https://en.wikipedia.org/wiki/URL .

Frank.Chang
quelle
12

Für die Uri-Klasse in .NET enthält Authority den Port, Host nicht und auch keine Benutzerinformationen.

Einige Beispiele für gültige URIs:

Uri u = new Uri("http://www.domain.com/path");
Assert.AreEqual("www.domain.com", u.Authority);
Assert.AreEqual("www.domain.com", u.Host);
Assert.AreEqual("http://www.domain.com", u.GetLeftPart(UriPartial.Authority));

u = new Uri("http://www.domain.com:8080/path");
Assert.AreEqual("www.domain.com:8080", u.Authority);
Assert.AreEqual("www.domain.com", u.Host);
Assert.AreEqual("http://www.domain.com:8080", u.GetLeftPart(UriPartial.Authority));

u = new Uri("http://user:password@host:555/path");
Assert.AreEqual("host:555", u.Authority);
Assert.AreEqual("host", u.Host);
Assert.AreEqual("http://user:password@host:555", u.GetLeftPart(UriPartial.Authority));

Gemäß RFC3986 , Kapitel 3.2 die Behörde enthält

  1. Nutzerinformation
  2. Gastgeber
  3. Port-Nummer.

NICHT nur Host- und Portnummer.

Das Folgende ist beispielsweise ein gültiger URI:

http://user:password@host:80/path

in dem sich die Behörde befindet

user:password@host:80

Das at-Symbol (@) begrenzt die Benutzerinformationen vom Host und der Doppelpunkt (:) begrenzt den Host von der Portnummer. Innerhalb der Benutzerinformationen trennt ein Doppelpunkt (:) den Benutzernamen vom Passwort. (Ja, ich weiß, dass der Kennwortteil veraltet ist. Optional wird er möglicherweise weiterhin unterstützt.)

Dies ist die vollständige Spezifikation für eine Behörde. Offensichtlich sind die Benutzerinformationen und die Portnummer oft nicht vorhanden.

Die Uri-Klasse in .NET löscht die Benutzerinformationen bei der Rückgabe der Berechtigung, was ziemlich ärgerlich ist, weil es nicht korrekt ist. Stattdessen finden Sie die Benutzerinformationen in der UserInfo-Eigenschaft:

Uri.UserInfo

Andere Antworten sind technisch korrekt, um zu sagen, dass für die .NET Uri-Klasse der Unterschied zwischen Uri.Authority und Uri.Host darin besteht, dass der Host keine Portnummer enthält.

Beachten Sie jedoch, dass die Berechtigung für die Verwendung in der .NET Uri-Klasse nicht ordnungsgemäß definiert ist, da sie möglicherweise auch Benutzerinformationen enthält.

Steve Lautenschlager
quelle
10

Gemäß der Dokumentation, mit der Sie verlinkt haben, enthält die AuthorityEigenschaft die Portnummer, wenn sie nicht mit dem Standardport des Uri identisch ist, während die HostEigenschaft nur den DNS-Hostnamen oder die IP-Adresse zurückgibt.

Ich glaube nicht, dass es mehr Unterschiede gibt.

Brandon
quelle
1
Ein kleiner Zweifel. Wenn ich die Anwendung in localhost ausführe, habe ich eine Portnummer in meiner URL, aber in der Produktion habe ich keine Portnummer in der URL. Also kann ich Url.Authority frei benutzen, oder? Ich meine, wenn die Portnummer nicht vorhanden ist, verhält sich URl.Authority genauso wie URL.Host rechts. Ich meine, ich werde immer noch in der Lage sein, die URL richtig zu machen, oder? Bitte führen Sie mich.
Unbreakable
0

Die Autorität kann auch einen Benutzernamen und ein Passwort enthalten, z

bob: [email protected]

häufiger für FTP-URIs verwendet

Adrien
quelle
Entschuldigung, du liegst falsch. Aus RFC 3986 Abschnitt 3.2 Autorität "Authority = [Benutzerinfo" @ "] Host [": "Port]"
Adrien
Benutzerinformationen mit einfachen Kennwörtern sind im RFC veraltet, werden jedoch immer noch häufig verwendet, insbesondere bei FTP-URIs, und der IE unterstützt dies weiterhin (tatsächlich ist dies die einzige Möglichkeit, mit FTP über den IE über einen http-Proxy zu authentifizieren).
Adrien
4
Die Frage bezieht sich auf System.URI.Authority, die NICHT mit RFC 3986 identisch ist.
Brian