Jaka jest różnica między Uri.Host a Uri.Authority

86

System.Urima Host, Authorityi DnsSafeHost. MS stanowi dobry przykład tego, kiedy Hosti DnsSafeHosttutaj różne .

Chciałbym mieć podobny przykład / wyjaśnienie dla Hosti Authority.

Brian
źródło

Odpowiedzi:

105

Tak, Brandon ma całkowitą rację, w kategoriach laika

Urząd = nazwa hosta + numer portu

A jeśli protokół URL używa domyślnego portu, powiedzmy port 80 dla adresu URL http, to tylko w tym przypadku Urząd = Nazwa hosta (przyjmuje się, że numer portu to 80),

Natomiast nazwa hosta to nazwa domeny lub adres IP

Przykład:

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

    Authority = www.example.com
    Host Name = www.example.com

  2. http://255.255.255.255:8080/

    Urząd = 255.255.255.255:8080
    Nazwa hosta = 255.255.255.255

Saurabh Mishra
źródło
1
Jedna mała wątpliwość. jeśli uruchamiam aplikację w localhost mam numer portu w adresie URL, ale w produkcji nie mam numeru portu w adresie URL. Więc mogę swobodnie korzystać z Url.Authority, prawda? Mam na myśli, że jeśli nie ma numeru portu, URl.Authority będzie działać tak samo jak URL.Host right. Chodzi mi o to, że nadal będę w stanie poprawnie uzyskać adres URL, prawda? proszę, prowadź mnie,.
Unbreakable
Przeczytaj stackoverflow.com/a/39415643/316343 , brakowało User Informationczęści.
Jahan
Czy istnieje odniesienie do dokumentacji dla tej odpowiedzi? Coś autorytatywnego?
Jonathan M
35

Ze strony MSDN URI.Host .

W przeciwieństwie do właściwości Authority ta wartość właściwości nie obejmuje numeru portu.

kervin
źródło
Jedna mała wątpliwość. jeśli uruchamiam aplikację w localhost mam numer portu w adresie URL, ale w produkcji nie mam numeru portu w adresie URL. Więc mogę swobodnie korzystać z Url.Authority, prawda? Mam na myśli, że jeśli nie ma numeru portu, URl.Authority będzie działać tak samo jak URL.Host right. Chodzi mi o to, że nadal będę w stanie poprawnie uzyskać adres URL, prawda? proszę, prowadź mnie.
Unbreakable
@Unbreakable - Zgadza się, będzie działać w obu przypadkach. Jeśli nie określisz numeru portu w adresie URL, użyjesz tylko domyślnego iw takim przypadku Url.Authority pomija ten port.
BornToCode
17

Każdy adres URL HTTP jest zgodny ze składnią ogólnego identyfikatora URI. Ogólna składnia identyfikatora URI składa się z hierarchicznej sekwencji pięciu składników:

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

gdzie komponent autorytetu dzieli się na trzy podkomponenty:

authority = [userinfo@]host[:port]

Lubię to:

wiki

Opcjonalny komponent autorytetu poprzedzony dwoma ukośnikami (//), zawierający:

  • Opcjonalne informacje o użytkowniku który może składać się z nazwy użytkownika i opcjonalnego hasła poprzedzonego dwukropkiem (:), po którym następuje symbol at (@). Użycie formatu nazwa_użytkownika: hasło w podkomponentu informacji o użytkowniku jest przestarzałe ze względów bezpieczeństwa. Aplikacje nie powinny wyświetlać jako zwykłego tekstu żadnych danych po pierwszym dwukropku (:) znalezionych w podskładniku informacji o użytkowniku, chyba że dane po dwukropku są pustym łańcuchem (wskazującym brak hasła).
  • Opcjonalny składnik podrzędny hosta , składający się z zarejestrowanej nazwy (w tym między innymi nazwy hosta) lub adresu IP. Adresy IPv4 muszą być podane w notacji dziesiętnej z kropkami, a adresy IPv6 należy ująć w nawiasy kwadratowe ([]).
  • Opcjonalny składnik podrzędny portu poprzedzony dwukropkiem (:).

Więcej informacji można znaleźć pod adresem https://en.wikipedia.org/wiki/URL .

Frank.Chang
źródło
12

W przypadku klasy Uri w platformie .NET Urząd obejmuje port, a Host nie zawiera informacji o użytkowniku.

Kilka przykładów prawidłowych identyfikatorów URI:

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));

Zgodnie z RFC3986 , sekcja 3.2 Urząd zawiera

  1. Informacje o użytkowniku
  2. Gospodarz
  3. Numer portu.

NIE tylko numer hosta i portu.

Na przykład poniżej przedstawiono prawidłowy identyfikator URI:

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

w którym znajduje się Urząd

user:password@host:80

Symbol at (@) oddziela informacje o użytkowniku z hosta, a dwukropek (:) oddziela hosta od numeru portu. W informacjach o użytkowniku, dwukropek (:) oddziela nazwę użytkownika od hasła. (Tak, wiem, że część hasła jest przestarzała. Opcjonalnie może być nadal obsługiwana).

To jest pełna specyfikacja organu. Oczywiście informacje o użytkowniku i numer portu często nie są obecne.

Klasa Uri .NET spada informacji użytkownika po powrocie organu, który jest dość irytujące, ponieważ nie jest prawidłowe. Zamiast tego możesz znaleźć informacje o użytkowniku we właściwości UserInfo:

Uri.UserInfo

Inne odpowiedzi są technicznie poprawne, jeśli chodzi o klasę .NET Uri różnica między Uri.Authority i Uri.Host polega na tym, że host nie będzie zawierał numeru portu.

Należy jednak pamiętać, że uprawnienia nie są odpowiednio zdefiniowane w sposób, w jaki są używane w klasie .NET Uri, ponieważ mogą również zawierać informacje o użytkowniku.

Steve Lautenschlager
źródło
10

Zgodnie z dokumentacją, z którą utworzyłeś łącze, Authoritywłaściwość będzie zawierać numer portu, jeśli nie jest taki sam jak domyślny port Uri, a Hostwłaściwość zwróci tylko nazwę hosta DNS lub adres IP.

Nie sądzę, żeby było więcej różnic niż to.

Brandon
źródło
1
Jedna mała wątpliwość. jeśli uruchamiam aplikację w localhost mam numer portu w adresie URL, ale w produkcji nie mam numeru portu w adresie URL. Więc mogę swobodnie korzystać z Url.Authority, prawda? Mam na myśli, że jeśli nie ma numeru portu, URl.Authority będzie działać tak samo jak URL.Host right. Chodzi mi o to, że nadal będę w stanie poprawnie uzyskać adres URL, prawda? proszę, prowadź mnie.
Unbreakable
0

Uprawnienie może również zawierać nazwę użytkownika i hasło, np

bob: [email protected]

częściej używany dla identyfikatorów URI FTP

Adrien
źródło
przepraszam, mylisz się. Z dokumentu RFC 3986, sekcja 3.2 Authority "Authority = [informacje o użytkowniku" @ "] host [": "port]"
Adrien
informacje o użytkowniku ze zwykłymi hasłami są przestarzałe w RFC, ale nadal są w powszechnym użyciu, szczególnie w przypadku identyfikatorów URI FTP, a IE nadal to obsługuje (w rzeczywistości jest to jedyny sposób na autoryzację z FTP przez IE przez proxy http).
Adrien
4
Pytanie dotyczy Autoryzacji System.URI., która NIE jest tym samym, co RFC 3986.
Brian