2009-01-29 16 views
10

Estoy refactorizando una aplicación web ASP.NET que funciona para exponer la interfaz de servicios web mediante el servicio web ASP.NET. De acuerdo con Web Services authentication - best practices, la autenticación básica sobre https es el camino a seguir. Supongamos que sí, a diferencia de WS-Security, X509, etc.Autenticación básica HTTP personalizada para servicios web ASP.NET en .NET 3.5/VS 2008

En .NET 3.5/VS 2008, ¿cuál es la forma más simple de implementar autenticación básica de HTTP personalizada (cuenta no de Windows), por ejemplo, aceptando solo si el nombre de usuario es "foo" y la contraseña es "bar". En definitiva, me gustaría configurar Thread.CurrentPrincipal.

¿Escribo mi propio HttpModule o se puede hacer esto más simple?

Respuesta

5

Probablemente usando Custom Basic Authentication for IIS, escrito por Dominick Baier es el camino a seguir. As he points out Los nombres de usuario de WCF 3.5 sobre la seguridad del transporte no se pueden usar en el servicio alojado en IIS, aunque mi pregunta era sobre los servicios web ASP.NET y no sobre WCF.

Hay otra implementación de módulo HTTP llamada Basic authentication in ASP.NET against custom datasource por Santosh Sahoo.

Aunque no es lo que yo quería, encontré QuickStart Tutorial's SOAP Headers sample como una solución informativa. Enviar la contraseña en texto plano a través de http es claramente inseguro, pero este ejemplo podría ampliarse para agregar más seguridad, por ejemplo, ejecutarse en https o enviar hash de "contraseña + GUID de una sola vez + marca de tiempo".

1

Si está considerando WCF, puede usar la seguridad de nombre de usuario OverTransport para basicHttpBinding. es decir, el nombre de usuario y passowrd residen en el encabezado SOAP de la solicitud y todo el tráfico está protegido por cifrado SSL a través del cable.

Un validador UserNamePasswordValidator personalizado se puede utilizar para autenticar las credenciales entrantes contra, p. base de datos.

Puede establecer el principal del subproceso dentro de una IAuthorizationPolicy personalizada en el comportamiento del servicio.

p. Ej. Evaluar la implementación método para IAuthorizationPolicy para establecer director actual

public bool Evaluate(EvaluationContext evaluationContext, ref object state) 
{ 
     Object obj; 
     if(evaluationContext.Properties.TryGetValue("Identities", out obj)) 
     { 
      // get the authenticated identity 
      IIdentity client = (obj as IList<IIdentity>)[0]; 
      evaluationContext.Properties["Principal"] = ... // create principal obj here for the identity 
      // this will set thread's current principal 
     } 
     return true; 
} 
+0

Quiero el usuario y la contraseña en el encabezado http, no en el encabezado SOAP. Además, el nombre de usuario para el transporte no funciona en IIS: http://www.leastprivilege.com/WCFUsernamesOverTransportAndIISHosting.aspx –

+0

usernameOverTransport for basicHttpBinding definitivamente funciona incluso alojado en IIS, tengo la solución implementada en producción hace un tiempo. tenga en cuenta que no es la autenticación básica la que se configura en IIS. está en el nivel de mensaje de jabón. –

3

Grab el valor de la cabecera Authorization, analizar y validar el nombre de usuario/contraseña.

El valor es username: password, codificado como una cadena Base64.

Ver http://en.wikipedia.org/wiki/Basic_access_authentication para más detalles.

Editar: si desea que esta hecho para cada solicitud, utilizando el esquema de autenticación personalizado, entonces sería más fácil escribir un HttpModule para manejar el análisis de la cabecera y el establecimiento principal del hilo.

Cuestiones relacionadas