2011-01-12 30 views
25

Me gustaría saber por qué mi aplicación asp.net no agregará el encabezado a mi publicación cuando se llame 'Autorización', pero funcionará bien cuando cambie un carácter, diga "Autorizaciones". En la documentación de otros sitios siempre usan el nombre "Autorización", por lo que también me gustaría, y en este momento solo quiero entender por qué.Encabezado de autorización HTTP ASP.NET

He leído algunos temas al respecto, pero no he encontrado ninguna razón lógica para ello.

Aquí está mi código de abajo:

string fileName = "c:\\xyz.xml"; 
string uri = "http://myserver/Default.aspx"; 
req = WebRequest.Create(uri); 
req.Method = "POST"; 
req.ContentType = "text/xml"; 
byte[] authBytes = Encoding.UTF8.GetBytes("DDSServices:jCole2011".ToCharArray()); 
req.Headers.Add("Authorization", "BASIC " + Convert.ToBase64String(authBytes)); 
req.Headers.Add("test", "test"); 
UTF8Encoding encoder = new UTF8Encoding(); 
byte[] data = encoder.GetBytes(this.GetTextFromXMLFile(fileName)); 
req.ContentLength = data.Length; 
Stream reqStream = req.GetRequestStream(); 
reqStream.Write(data, 0, data.Length); 
reqStream.Close(); 
req.Headers.Add("Authorization", "BASIC" + Convert.ToBase64String(authBytes)); 
System.Net.WebResponse response = req.GetResponse(); 
System.IO.StreamReader reader = new StreamReader(response.GetResponseStream()); 
string str = reader.ReadToEnd(); 

El otro molesto que es cuando puedo añadir la variable visto a través violinista que trabaja muy bien.

Respuesta

11

Para la Autorización básica HTTP, debe utilizar la propiedad Credentials.

req.Credentials = new NetworkCredential("DDSServices", "jCole2011");

Esto debería hacer lo que quiera. En lugar de configurar el encabezado de Autorización.

+0

o hay una razón lógica? Una gran empresa de terceros con la que trabajamos tiene documentación con su autorización de la misma manera, por lo que me gustaría saber el motivo. – Cody

+1

Es mucho mejor usar el enfoque de NetworkCredential como lo sugiere Will. Sin embargo, su enfoque también debería funcionar bien, aunque no entiendo por qué lo hace dos veces (una antes de llamar a GetRquestStream, y una vez después. Debe hacerlo una vez antes de llamar a GetRequestStream. Si aún no funciona, obtenga un instrucciones de seguimiento en http://ferozedaud.blogspot.com/2009/08/tracing-with-systemnet.html – feroze

+0

¿Puede decirme por qué es mejor? ¿O dónde puedo leer acerca de por qué es mejor? parece que las NetworkCredentials estarían vinculadas con la autenticación de anuncios o formularios, preferiría que la conexión fuera anónima, y ​​luego solo verificar. De cualquier forma, ¿alguien puede decirme por qué? Casi no me importa lo que en este momento. – Cody

3

NetworkCredential es una buena solución, pero el sitio al que llama tiene que encargarse de un no autorizado con un encabezado 401 AND WWW-Authenticate en la respuesta.

Cliente:

request.Credentials = new CredentialCache {{aUri, "Basic", new NetworkCredential(aUserName, aPassword)}}; 

Servidor:

Response.ClearContent(); 
Response.StatusCode = 401; 
Response.AddHeader("WWW-Authenticate", "Basic"); 
Response.End(); 

Esto dará lugar a 2 accesos al servidor. La llamada inicial irá al servidor sin credenciales. Cuando el servidor responde con un encabezado 401 AND the WWW-Authenticate (con el tipo de autenticación requerida), la solicitud se reenviará con las credenciales en la solicitud.

+3

Esto es cierto, pero devolver 401 no autorizado, y el encabezado WWW-Authenticate es parte de la especificación HTTP. Si desea forzar el envío del encabezado en la primera solicitud, puede hacerlo a través del método PreAuthenticate. Además, IIS maneja automáticamente el envío de esta respuesta, al igual que otros servidores HTTP bien escritos como Apache. Así es como los navegadores saben para mostrar el cuadro de diálogo de solicitud de contraseña. –

41

Me encontré con una pregunta sobre cómo agregar Autenticación/Credenciales a los encabezados. Encontré la solución de la siguiente manera.

string _auth = string.Format("{0}:{1}", "myUser","myPwd"); 
string _enc = Convert.ToBase64String(Encoding.ASCII.GetBytes(_auth)); 
string _cred = string.Format("{0} {1}", "Basic", _enc); 
req.Headers[HttpRequestHeader.Authorization] = _cred; 

Lo que me dio esas cabeceras que quiero (descripciones de Wireshark pegados),

Autorización: Básico bXlVc2VyOm15UHdk \ r \ n
Credenciales: myUser: MyPwd

+0

Entonces, ¿cómo puede saber con certeza que la codificación que debe usar es ASCII? –

+1

Buen punto. La codificación elegida parece una posible fuente "difícil de encontrar" para los errores. Agrego el enlace http://stackoverflow.com/questions/7242316/what-encoding-should-i-use-for-http-basic-authentication para que los lectores encuentren más información sobre cómo decidir. – Independent

Cuestiones relacionadas