2010-10-19 13 views
16

Dies sollte viel einfacher als es sich erwiesen hat!IIS7-Standardauthentifizierung zum Schutz einer Website, die Formularauthentifizierung verwendet

Ich habe eine ASP.Net-Webanwendung, die FORMS-Authentifizierung verwendet, um einen Teil der Site (d. H. Den Mitglieds-Login-Bereich) zu sichern.

Jetzt möchte ich einfach eine traditionelle/einfache Browser Passwort Popup (Verzeichnis Sicherheit) über die gesamte Website, weil wir es testen und wollen nicht, dass jemand über die Website stolpern und die unvollendete Version usw. zu sehen!

Dies war in älteren IIS-Versionen sehr einfach.

Ich habe "Basisauthentifizierung installiert" (wie IIS7 jetzt mit diesem nicht aus der Box kommt). Aber wenn ich es aktiviere, sagt es mir, dass ich das nicht gleichzeitig mit einer Redirect-basierten Authentifizierung aktivieren kann (was meine FORMS-Authentifizierung verwendet).

Also das ist nur dumm.

Es muss eine sehr einfache Möglichkeit geben, einfach ein billiges Popup-Passwort über die gesamte Site zu setzen, ohne die andere Authentifizierungsmethode zu beeinflussen, die Sie in web.config für die eigentliche Anwendung eingerichtet haben.

Vielen Dank ..

UPDATES IP Zugriffsbeschränkungen sind nicht gut für ein paar Gründe: - Meine IP ist dynamisch und daher ändert sich ständig. - Ich möchte niemanden belästigen, der die Seite sehen muss, indem ich sie auffordere, eine Konsole auf ihrem Rechner aufzustellen und ihre IP-Adresse herauszufinden oder ihren Router zu überprüfen. Viele von ihnen sind nicht-technische Geschäftsnutzer und sie dauert eine Stunde, um ihre IP-Adresse herauszufinden. - Sowohl die Basisauthentifizierung als auch die Windows-Authentifizierung erlauben nicht, dass die zugrunde liegende Formularauthentifizierung darunter verbleibt.

Was wir hier zu haben scheinen, ist ein riesiger Fall von Microsoft, der versucht, Dinge zu über-konstruieren, und infolgedessen ist eine sehr einfache uralte Voraussetzung nicht mehr möglich oder leicht zu erreichen. Das muss irgendwie möglich sein ... JEMAND ???

Antwort

2

Es gibt eine einfache Lösung für Sie ist, da Sie die Formularauthentifizierung verwenden möchten ...

  1. diesen Abschnitt Ihrer web.config unter dem Haupt-Header hinzufügen. Füge es nicht zusammen - kopiere es einfach als einen Block. Das location-Tag wird diese Regeln vom Rest der web.config isolieren und später leicht entfernen lassen.

    <location allowOverride="false"> 
          <system.web> 
           <authentication mode="Forms"> 
            <forms loginUrl="frontdoor.aspx" name=".ASPXFORMSAUTH"> 
            </forms> 
           </authentication> 
           <authorization> 
            <deny users="?" /> 
           </authorization> 
          </system.web> 
         </location> 
    
  2. Erstellen Sie eine Seite namens "frontdoor.aspx". Holen Sie den Inhalt dieser Aspx-Seite von diesem Link: http://msdn.microsoft.com/en-us/library/xdt4thhy.aspx (scrollen Sie nach unten, wo es heißt: "So erstellen Sie die Anmeldeseite")

  3. ALLE FERTIG! Dadurch wird Ihre gesamte Site gesperrt und Sie können den Benutzernamen und das Passwort (ich nenne diesen Vorgang "Verriegeln der Fronttür") für die Vordertür unabhängig vom Rest der Site festlegen.Die Haustür LEGIC Ausweise sind in der vorderen Tür-Datei selbst angegeben (nicht sehr sicher, aber gut genug für das, was Sie (wir) müssen) in diesem bedingten:

    [Zeile 6:]

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

Passen Sie die Bedingung an Ihre Bedürfnisse an und senden Sie Ihren Kunden/Geschäftstypen per E-Mail die Anmeldeinformationen an die Eingangstür.

+0

Diese Lösung wird nicht funktionieren, wenn Sie den Mitarbeitern des Unternehmens (mit der grundlegenden Anmeldung) den Zugriff auf Testkonten für die formularbasierten Logins gewähren möchten. – Dementic

4

Ich laufe auf das gleiche Problem. Ich werde eine Beta-Site einrichten, die auf eine Vorschau-Gruppe beschränkt ist. Die Website verwendet die Formularauthentifizierung, aber einige Personen aus der Vorschaugruppe verfügen über Website-Konten und andere nicht. Unabhängig davon muss sich jeder Benutzer bei root authentifizieren, um Zugriff auf die Vorschau zu erhalten.

Bis jetzt ist das einzige, was ich habe genau arbeiten, wie ich es will Helicon Ape. Ich führe den Prozess und so weit, so gut.

Standard-.htaccess-Datei im Stammverzeichnis.

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

Benutzer .htpasswd einen Benutzernamen und ein Passwort hinzuzufügen: username:encryptedpassword.

+0

Warst du bei dieser Lösung? Irgendwelche Nachteile? – marapet

3

Was Sie beschreiben, ist eine Einschränkung der Standard ASP.NET, es ist nur für ein Authentifizierungsmodul gleichzeitig ausgeführt. Die Lösung besteht darin, Ihre eigene IHttpModule zu erstellen, die Ihre benutzerdefinierte Authentifizierung durchführt, und bei Erfolg die Anforderung an ASP.NET weitergibt, die weiterhin Forms verwendet.

Das Folgende ist eine grundlegende Implementierung eines solchen Moduls. Es wird eine 401 Unauthorized zurückgeben und den Benutzer bitten, sich an dem Realm WOPR anzumelden. Es akzeptiert dann das Passwort Joshua und ignoriert den angegebenen Benutzernamen.

Kompilieren Sie dies als separate Baugruppe und fügen Sie sie zu Ihrer web.config in den Abschnitten system.web/httpModules und system.webServer/modules hinzu. Keine andere Änderung Ihrer Webanwendung ist erforderlich.

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"; 
     } 
    } 
} 
Verwandte Themen