c# - renovar - seguridad de windows microsoft outlook credenciales
¿Cómo puedo recuperar las credenciales de Autenticación Básica desde el encabezado? (2)
De mi blog:
Esto explicará en detalle cómo funciona todo esto:
Paso 1 - Entender la autenticación básica
Siempre que use Basic Authentication, se agrega un encabezado a HTTP Request y se verá similar a esto:
Autorización: QWxhZGRpbjpvcGVuIHNlc2FtZQ == básico
Fuente: http://en.wikipedia.org/wiki/Basic_access_authentication
"QWxhZGRpbjpvcGVuIHNlc2FtZQ ==" es solo "nombre de usuario: contraseña" codificada en Base64 ( http://en.wikipedia.org/wiki/Base64 ). Para acceder a los encabezados y otras propiedades HTTP en .NET (C #), debe tener acceso al contexto HTTP actual:
HttpContext httpContext = HttpContext.Current;
Esto lo puede encontrar en el espacio de nombres System.Web.
Paso 2: obtener el encabezado
El encabezado de autorización no es el único en el HttpContext. Para acceder al encabezado, necesitamos obtenerlo de la solicitud.
string authHeader = this.httpContext.Request.Headers["Authorization"];
Si depura el código, verá que el contenido de ese encabezado es similar a este:
Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ ==
Paso 3 - Verificando el encabezado
Ya ha extraído el encabezado, ahora hay varias cosas que debe hacer:
- Verifique que el encabezado no sea nulo
- Verifique que el mecanismo de Autorización / Autenticación sea de hecho "Básico"
Al igual que:
if (authHeader != null && authHeader.StartsWith("Basic")) {
//Extract credentials
} else {
//Handle what happens if that isn''t the case
throw new Exception("The authorization header is either empty or isn''t Basic.");
}
Ahora tiene que verificar que tiene algo de lo que extraer datos.
Paso 4 - Extrayendo credenciales
Eliminando la subcadena "Básica"
Ahora puede intentar obtener los valores de nombre de usuario y contraseña. En primer lugar, debes deshacerte de la subcadena "Básica". Puedes hacerlo así:
string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();
Vea los siguientes enlaces para más detalles:
- http://msdn.microsoft.com/en-us/library/system.string.substring(v=vs.110).aspx
- http://msdn.microsoft.com/en-us/library/t97s7bs3(v=vs.110).aspx
Decodificación Base64
Ahora tenemos que decodificar desde Base64 a la cadena:
//the coding should be iso or you could use ASCII and UTF-8 decoder
Encoding encoding = Encoding.GetEncoding("iso-8859-1");
string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword));
Ahora el nombre de usuario y la contraseña estarán en este formato:
username:password
División de nombre de usuario: contraseña
Para obtener un nombre de usuario y contraseña, simplemente podemos obtener el índice del ":"
int seperatorIndex = usernamePassword.IndexOf('':'');
username = usernamePassword.Substring(0, seperatorIndex);
password = usernamePassword.Substring(seperatorIndex + 1);
Ahora puede usar estos datos para probar. ¡Buena suerte!
PD: el código final puede verse así:
HttpContext httpContext = HttpContext.Current;
string authHeader = this.httpContext.Request.Headers["Authorization"];
if (authHeader != null && authHeader.StartsWith("Basic")) {
string encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();
Encoding encoding = Encoding.GetEncoding("iso-8859-1");
string usernamePassword = encoding.GetString(Convert.FromBase64String(encodedUsernamePassword));
int seperatorIndex = usernamePassword.IndexOf('':'');
var username = usernamePassword.Substring(0, seperatorIndex);
var password = usernamePassword.Substring(seperatorIndex + 1);
} else {
//Handle what happens if that isn''t the case
throw new Exception("The authorization header is either empty or isn''t Basic.");
}
Estoy tratando de escribir algunas pruebas simples Mecanismo de autenticación de usuario que utiliza la Autenticación básica. ¿Cómo puedo recuperar las credenciales del encabezado?
string authorizationHeader = this.HttpContext.Request.Headers["Authorization"];
¿A donde voy desde aqui? Hay varios tutoriales, pero soy nuevo en .NET y la autenticación, ¿podría explicar en su respuesta exactamente paso a paso qué y por qué está haciendo?
Respuesta impresionante de @DawidO.
Si solo buscas extraer los auth creds básicos y confiar en .NET magic dado que tienes HttpContext, esto también funcionará:
public static void StartListener() {
using (var hl = new HttpListener()) {
hl.Prefixes.Add("http://+:8008/");
hl.AuthenticationSchemes = AuthenticationSchemes.Basic;
hl.Start();
Console.WriteLine("Listening...");
while (true) {
var hlc = hl.GetContext();
var hlbi = (HttpListenerBasicIdentity)hlc.User.Identity;
Console.WriteLine(hlbi.Name);
Console.WriteLine(hlbi.Password);
//TODO: validater user
//TODO: take action
}
}
}