2010-10-19 7 views
16

Questo dovrebbe essere molto più semplice di quanto non sia stato dimostrato!IIS7 autenticazione di base per proteggere un sito che utilizza l'autenticazione dei moduli

Possiedo un'app Web ASP.Net che utilizza l'autenticazione FORMS per proteggere parte del sito (ovvero l'area di accesso membri).

Ora voglio semplicemente inserire un popup di password del browser tradizionale/semplice (sicurezza della directory) sull'intero sito perché lo stiamo testando e non vogliamo che nessuno inciampi attraverso il sito e veda la versione incompleta ecc.!

Questo era molto semplice nelle versioni IIS precedenti.

I "ha installato l'autenticazione di base" (poiché IIS7 non viene fornito immediatamente con questo). Ma quando lo abilito, mi dice che non posso averlo abilitato allo stesso tempo di qualsiasi autenticazione basata sul reindirizzamento (che è ciò che usa l'autenticazione FORMS).

Quindi è semplicemente stupido.

Deve esserci un modo semplicissimo per inserire semplicemente una password popup a basso costo su tutto il sito senza influire sull'altro metodo di autenticazione che è stato impostato all'interno di web.config per l'applicazione effettiva.

Molte grazie ..

AGGIORNAMENTI le limitazioni di accesso IP non sono buoni per un paio di motivi: - My IP è dinamico e quindi in continua evoluzione. - Non voglio disturbare nessuno che abbia bisogno di vedere il sito chiedendo loro di far apparire una console sul loro computer e calcolare il loro indirizzo IP o controllare il loro router, ecc. Molti di loro sono utenti aziendali non tecnici e impiegheranno un'ora per elaborare il loro indirizzo IP. - Sia l'autenticazione di base che l'autenticazione di Windows non consentono l'autenticazione dei moduli sottostanti per rimanere al loro posto al di sotto.

Quello che sembra avere qui è un caso massivo di Microsoft che cerca di sovra-ingegnerizzare le cose e di conseguenza non è più possibile o facilmente realizzabile un requisito semplice e antico. Questo deve essere possibile in qualche modo ... CHIUNQUE ???

risposta

2

C'è una soluzione semplice per voi dal momento che si desidera utilizzare l'autenticazione di form ...

  1. Aggiungi questa sezione per web.config sotto l'intestazione principale. Non unirlo: basta copiarlo incollandolo come un blocco. Il tag location isolerà queste regole dal resto del web.config e ne consentirà la facile rimozione in seguito.

    <location allowOverride="false"> 
          <system.web> 
           <authentication mode="Forms"> 
            <forms loginUrl="frontdoor.aspx" name=".ASPXFORMSAUTH"> 
            </forms> 
           </authentication> 
           <authorization> 
            <deny users="?" /> 
           </authorization> 
          </system.web> 
         </location> 
    
  2. creare una pagina chiamata "frontdoor.aspx". Ottieni il contenuto di quella pagina di aspx da questo link: http://msdn.microsoft.com/en-us/library/xdt4thhy.aspx (scorri verso il basso dove dice: "Per creare la pagina di accesso")

  3. TUTTO FATTO! Questo bloccherà l'intero sito e ti permetterà di specificare il nome utente e la password (chiamo questo processo "bloccando la porta principale") per la porta anteriore indipendentemente dal resto del sito.Le credenziali delle portiere anteriori sono specificati nel file porta stessa (non molto sicuro, ma abbastanza buono per quello che (noi) serve) in questa condizione:

    [Linea 6:]

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

Modifica il condizionale in base alle tue esigenze e poi invia via e-mail ai tuoi clienti/aziende: digita le credenziali sulla porta principale.

+0

Questa soluzione non funzionerà se si desidera consentire l'accesso ai colleghi dell'azienda (con l'accesso di base) mentre si utilizzano gli account di test per gli accessi basati su moduli. – Dementic

4

Ho riscontrato lo stesso problema. Inserirò un sito beta limitato a un gruppo di anteprima. Il sito Web utilizza l'autenticazione basata su form ma alcune persone del gruppo di anteprima avranno account di siti Web e altri no. Indipendentemente da tutti, sarà necessario autenticarsi alla radice per accedere all'anteprima.

Finora l'unica cosa che ho funzionato esattamente nel modo in cui lo voglio è Helicon Ape. Sto conducendo il processo e finora tutto bene.

File .htaccess standard nella radice.

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

utente Htpasswd per aggiungere un nome utente e una password: username:encryptedpassword.

+0

Sei rimasto con questa soluzione? Qualche inconveniente? – marapet

3

Quello che descrivi è una limitazione di ASP.NET predefinito, è costruito solo per eseguire un modulo di autenticazione alla volta. La soluzione è creare il proprio IHttpModule che esegue l'autenticazione personalizzata e, in caso di esito positivo, passare la richiesta a ASP.NET che continua a utilizzare Moduli.

Quanto segue è un'implementazione di base di tale modulo. Restituirà un 401 Unauthorized e chiederà all'utente di accedere al dominio WOPR. Accetterà quindi la password Joshua, ignorando il nome utente specificato.

Compilare questo come un assieme separato e aggiungerlo al proprio web.config, nelle sezioni system.web/httpModules e system.webServer/modules. Non sono richieste altre modifiche della tua applicazione 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"; 
     } 
    } 
} 
Problemi correlati