¿Cuál es la diferencia entre Uri.Host y Uri.Authority?

82

System.Uritiene Host, Authorityy DnsSafeHost. MS proporciona un buen ejemplo de cuándo Hosty DnsSafeHostson diferentes aquí .

Me gustaría un ejemplo / explicación similar para Hosty Authority.

Brian
fuente

Respuestas:

103

Sí, Brandon tiene toda la razón, en términos sencillos.

Autoridad = Nombre de host + No de puerto

Y si el protocolo URL está usando un puerto predeterminado, digamos puerto 80 para la URL http, entonces solo en ese caso Autoridad = Nombre de host (se supone que el número de puerto es 80),

Considerando que el nombre de host es nombre de dominio o dirección IP

Ejemplo:

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

    Autoridad = www.example.com
    Nombre de host = www.example.com

  2. http://255.255.255.255:8080/

    Autoridad = 255.255.255.255:8080
    Nombre de host = 255.255.255.255

Saurabh Mishra
fuente
1
Una pequeña duda. si ejecuto la aplicación en localhost, tengo el número de puerto en mi URL pero en producción no tengo el número de puerto en la URL. Entonces, puedo usar Url.Authority libremente, ¿verdad? Quiero decir, si el número de puerto no está allí, entonces URl.Authority actuará igual que URL.Host correcto. Quiero decir, todavía podré obtener la URL correctamente, ¿verdad? por favor guíame,.
Irrompible
Lea stackoverflow.com/a/39415643/316343 , se perdió la User Informationpieza.
Jahan
35

Desde la página MSDN URI.Host .

A diferencia de la propiedad Authority, este valor de propiedad no incluye el número de puerto.

kervin
fuente
Una pequeña duda. si ejecuto la aplicación en localhost, tengo el número de puerto en mi URL pero en producción no tengo el número de puerto en la URL. Entonces, puedo usar Url.Authority libremente, ¿verdad? Quiero decir, si el número de puerto no está allí, entonces URl.Authority actuará igual que URL.Host correcto. Quiero decir, todavía podré obtener la URL correctamente, ¿verdad? por favor guíame.
Irrompible
@Unbreakable - Así es, funcionará en ambos casos. Cuando no especifica el número de puerto en la URL, simplemente usa el predeterminado y, en ese caso, Url.Authority omite el puerto.
BornToCode
15

Cada URL HTTP se ajusta a la sintaxis de un URI genérico. La sintaxis genérica de URI consta de una secuencia jerárquica de cinco componentes:

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

donde el componente de autoridad se divide en tres subcomponentes:

authority = [userinfo@]host[:port]

Me gusta esto:

wiki

Un componente de autoridad opcional precedido por dos barras (//), que comprende:

  • Un opcional userinfo subcomponente que puede consistir en un nombre de usuario y una contraseña opcional precedido por dos puntos (:), seguido por un símbolo arroba (@). El uso del formato nombre de usuario: contraseña en el subcomponente userinfo está obsoleto por razones de seguridad. Las aplicaciones no deben mostrar como texto claro ningún dato después de los primeros dos puntos (:) que se encuentran dentro de un subcomponente de información de usuario a menos que los datos después de los dos puntos sean la cadena vacía (que indica que no hay contraseña).
  • Un subcomponente de host opcional , que consta de un nombre registrado (que incluye, entre otros, un nombre de host) o una dirección IP. Las direcciones IPv4 deben estar en notación decimal con puntos y las direcciones IPv6 deben ir entre corchetes ([]).
  • Un subcomponente de puerto opcional precedido por dos puntos (:).

Para obtener más detalles, puede consultar https://en.wikipedia.org/wiki/URL .

Frank.Chang
fuente
12

Para la clase Uri en .NET, Authority incluye el puerto, Host no lo hace y tampoco incluye información del usuario.

Algunos ejemplos de URI válidos:

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

Según RFC3986 , la Sección 3.2 de la Autoridad contiene

  1. informacion del usuario
  2. Anfitrión
  3. Número de puerto.

NO solo el host y el número de puerto.

Por ejemplo, el siguiente es un URI válido:

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

en el que la Autoridad es

user:password@host:80

El símbolo arroba (@) delimita la información del usuario del host y los dos puntos (:) delimitan el host del número de puerto. Dentro de la información del usuario, dos puntos (:) delimitan el nombre de usuario de la contraseña. (Sí, sé que la parte de la contraseña está obsoleta. Es posible que todavía se admita opcionalmente)

Esta es la especificación completa para una autoridad. Obviamente, la información del usuario y el número de puerto a menudo no están presentes.

La clase Uri en .NET elimina la información del usuario cuando devuelve la Autoridad, lo cual es bastante molesto porque no es correcto. En su lugar, puede encontrar la información del usuario en la propiedad UserInfo:

Uri.UserInfo

Otras respuestas son técnicamente correctas para decir que para la clase .NET Uri, la diferencia entre Uri.Authority y Uri.Host es que el host no contendrá un número de puerto.

Pero tenga en cuenta que la autoridad no está definida correctamente de la forma en que se usa en la clase .NET Uri porque también puede contener información del usuario.

Steve Lautenschlager
fuente
10

De acuerdo con la documentación a la que se vinculó, la Authoritypropiedad incluirá el número de puerto si no es el mismo que el puerto predeterminado de la Uri, mientras que la Hostpropiedad solo devolverá el nombre del host DNS o la dirección IP.

No creo que haya más diferencias que esa.

Brandon
fuente
1
Una pequeña duda. si ejecuto la aplicación en localhost, tengo el número de puerto en mi URL pero en producción no tengo el número de puerto en la URL. Entonces, puedo usar Url.Authority libremente, ¿verdad? Quiero decir, si el número de puerto no está allí, entonces URl.Authority actuará igual que URL.Host correcto. Quiero decir, todavía podré obtener la URL correctamente, ¿verdad? por favor guíame.
Irrompible
0

La autoridad también puede incluir un nombre de usuario y contraseña, p. Ej.

bob: [email protected]

más comúnmente utilizado para URI de FTP

Adrien
fuente
lo siento, estás equivocado. De RFC 3986 sección 3.2 Autoridad "autoridad = [userinfo" @ "] host [": "puerto]"
Adrien
La información de usuario con contraseñas simples está obsoleta en el RFC, pero todavía es de uso común, especialmente con URI de FTP, e IE todavía lo admite (de hecho, es la única forma de autenticación con FTP a través de IE a través de un proxy http).
Adrien
4
La pregunta es sobre System.URI.Authority, que NO es lo mismo que RFC 3986.
Brian