2010-10-19 22 views
16

¡Esto debería ser mucho más simple de lo que ha demostrado ser!Autenticación básica de IIS7 para proteger un sitio que usa la autenticación de formularios

Tengo una aplicación web ASP.Net que utiliza la autenticación FORMS para proteger parte del sitio (es decir, el área de inicio de sesión del miembro).

Ahora simplemente quiero poner una ventana emergente de navegador tradicional/simple (seguridad de directorio) en todo el sitio porque lo estamos probando y no queremos que nadie se tope con el sitio y vea la versión inacabada, etc.

Esto solía ser súper simple en las versiones anteriores de IIS.

He "instalado la autenticación básica" (ya que IIS7 no sale de la caja con esto ahora). Pero cuando lo habilito, me dice que no puedo tenerlo habilitado al mismo tiempo que cualquier autenticación basada en redireccionamiento (que es lo que usa mi autenticación FORMS).

Así que eso es simplemente estúpido.

Tiene que haber una manera súper simple de simplemente poner una contraseña emergente barata en todo el sitio sin afectar el otro método de autenticación que haya configurado dentro de web.config para la aplicación real.

Muchas gracias ..

ACTUALIZACIONES restricciones de acceso IP no son buenas para un par de razones: - Mi IP es dinámica y por lo tanto en constante cambio. - No quiero molestar a nadie que necesite ver el sitio pidiéndoles que abran una consola en su máquina y determinen su dirección IP o revisen su enrutador, etc. Muchos de ellos son usuarios comerciales no técnicos y les tomará una hora calcular su dirección IP. - Tanto la autenticación básica como la autenticación de Windows no permiten que la autenticación subyacente de formularios permanezca en su lugar debajo.

Lo que parece que tenemos aquí es un caso masivo de Microsoft que intenta sobre-diseñar cosas y, como resultado, ya no es posible ni alcanzable un requisito muy simple y antiguo. Esto tiene que ser posible de alguna manera ... ¿ALGUIEN?

Respuesta

2

Hay una solución simple para usted, ya que desea utilizar la autenticación de formularios ...

  1. Añadir esta sección para su web.config bajo el encabezado principal. No lo combines, solo copie y péguelo como un bloque. La etiqueta de ubicación aislará estas reglas del resto del web.config y permitirá su fácil eliminación más adelante.

    <location allowOverride="false"> 
          <system.web> 
           <authentication mode="Forms"> 
            <forms loginUrl="frontdoor.aspx" name=".ASPXFORMSAUTH"> 
            </forms> 
           </authentication> 
           <authorization> 
            <deny users="?" /> 
           </authorization> 
          </system.web> 
         </location> 
    
  2. Crea una página llamada "frontdoor.aspx". Obtenga el contenido de esa página aspx desde este enlace: http://msdn.microsoft.com/en-us/library/xdt4thhy.aspx (desplácese hacia abajo hasta donde dice: "Para crear la página de inicio de sesión")

  3. ALL DONE! Esto bloqueará todo su sitio y le permitirá especificar el nombre de usuario y la contraseña (llamo a este proceso "bloqueo de la puerta delantera") para la puerta frontal independientemente del resto del sitio.Las credenciales de las puertas delanteras se especifican en el archivo de puerta en sí (no muy seguro pero lo suficientemente bueno para lo que (nos) necesita) en este condicional:

    [Línea 6:]

    If ((UserEmail.Text = "TheSharedFrontDoorLogonName") And (UserPass.Text = "AndItsPassword")) Then 
    

Modifique el condicional para adaptarlo a sus necesidades y luego envíe por correo electrónico a sus clientes/tipos de negocios las credenciales a la puerta de entrada.

+0

Esta solución sin trabajo si se quiere dar acceso a la empresa compañeros de trabajo (con el inicio de sesión de base) durante el uso de cuentas de prueba para los inicios de sesión basados ​​formas. – Dementic

4

Me encuentro con el mismo problema. Voy a poner un sitio beta limitado a un grupo de vista previa. El sitio web usa autenticación de formularios, pero algunas personas del grupo de vista previa tendrán cuentas de sitios web y otras no. Independientemente de todo el mundo tendrá que autenticarse en la raíz para obtener acceso a la vista previa.

Hasta ahora, lo único que tengo trabajando exactamente como quiero es Helicon Ape. Estoy ejecutando la prueba y hasta ahora todo bien.

Archivo .htaccess estándar en la raíz.

AuthUserFile c:\fakepath\.htpasswd 
AuthType Basic 
AuthName "SITE SECURITY" 
Require valid-user 

usuario .htpasswd para agregar un nombre de usuario y contraseña: username:encryptedpassword.

+0

¿Te quedaste con esta solución? ¿Alguna desventaja? – marapet

3

Lo que describes es una limitación del ASP.NET predeterminado, solo está diseñado para ejecutar un módulo de autenticación a la vez. La solución es crear su propio IHttpModule que haga su autenticación personalizada, y si tiene éxito, pase la solicitud a ASP.NET que continúe usando Formularios.

La siguiente es una implementación básica de dicho módulo. Devolverá un 401 Unauthorized y le pedirá al usuario que inicie sesión en el dominio WOPR. A continuación, aceptará la contraseña Joshua, ignorando el nombre de usuario especificado.

Compile esto como un conjunto separado y agréguelo a su web.config, en las secciones system.web/httpModules y system.webServer/modules. No se requiere ninguna otra modificación de su aplicación web.

using System; 
using System.Text; 
using System.Web; 

namespace Research { 
    public class AuthenticationModule : IHttpModule { 
     public void Init(HttpApplication app) { 
      app.BeginRequest += (sender, e) => { 
       if (!Authenticate(app.Context)) { 
        app.Context.Response.Status = "401 Unauthorized"; 
        app.Context.Response.StatusCode = 401; 
        app.Context.Response.AddHeader("WWW-Authenticate", "Basic realm=WOPR"); 

        app.Response.ClearContent(); 
        app.Context.Response.End(); 
       } 
      }; 
     } 

     public void Dispose() { 
     } 

     public static Boolean Authenticate(HttpContext context) { 
      var authHeader = context.Request.Headers.Get("Authorization"); 
      if (String.IsNullOrEmpty(authHeader)) 
       return false; 

      if (!authHeader.StartsWith("Basic ")) 
       return false; 

      var base64Credentials = authHeader.Substring(6); 
      var binaryCredentials = Convert.FromBase64String(base64Credentials); 
      var asciiCredentials = Encoding.ASCII.GetString(binaryCredentials); 
      if (!asciiCredentials.Contains(":")) 
       return false; 

      var credentials = asciiCredentials.Split(new[] { ':' }, 2); 
      return credentials[1] == "Joshua"; 
     } 
    } 
} 
Cuestiones relacionadas