2010-10-19 4 views
16

To powinno być znacznie prostsze, niż się okazało!Podstawowe uwierzytelnianie IIS7 w celu ochrony witryny korzystającej z uwierzytelniania formularzy

Mam aplikację internetową ASP.Net, która korzysta z uwierzytelniania FORMS do zabezpieczenia części witryny (tj. Obszaru logowania członków).

Teraz po prostu chcę ustawić tradycyjne/proste hasło przeglądarki (zabezpieczenia katalogów) w całej witrynie, ponieważ testujemy to i nie chcemy, aby ktokolwiek natknął się na stronę i zobaczył niedokończoną wersję itp.

To było bardzo proste w starszych wersjach IIS.

Mam "zainstalowane podstawowe uwierzytelnienie" (ponieważ IIS7 nie wychodzi teraz z tego pola). Ale gdy go włączam, mówi mi, że nie mogę włączyć tej opcji w tym samym czasie, co uwierzytelnianie oparte na przekierowaniu (w tym celu wykorzystuje moje uwierzytelnianie FORMULARZA).

To jest po prostu głupie.

Musi być super prosty sposób na proste umieszczenie taniego wyskakującego hasła w całej witrynie bez wpływu na inną metodę uwierzytelniania, którą skonfigurowałeś w web.config dla rzeczywistej aplikacji.

Dziękujemy ..

AKTUALIZACJE ograniczenia dostępu IP nie są dobre dla kilku powodów: - My IP jest dynamiczny i dlatego ciągle się zmienia. - Nie chcę nikomu przeszkadzać, że trzeba zobaczyć stronę, prosząc ich o podniesienie konsoli na swoim komputerze i opracowanie adresu IP lub sprawdzenia routera itp. Wielu z nich to nietechniczne osoby zajmie im godzinę na wypracowanie swojego adresu IP. - Zarówno podstawowa autoryzacja auth, jak i windows nie pozwalają na uwierzytelnianie formularzy pod spodem.

To, co wydaje się mieć tutaj, to olbrzymi przypadek Microsoftu, który usiłuje przesadzić z inżynierią, a co za tym idzie, bardzo stare, starzejące się wymagania nie są już możliwe ani łatwe do osiągnięcia. To musi być możliwe jakoś ... KAŻDY ???

Odpowiedz

2

Istnieje proste rozwiązanie dla Ciebie, ponieważ chcesz użyć uwierzytelniania form ...

  1. Dodaj tę sekcję do web.config pod głównym cel. Nie łącz go - po prostu skopiuj wklej jako jeden blok. Tag lokalizacji oddzieli te reguły od reszty pliku web.config i umożliwi jego łatwe usunięcie później.

    <location allowOverride="false"> 
          <system.web> 
           <authentication mode="Forms"> 
            <forms loginUrl="frontdoor.aspx" name=".ASPXFORMSAUTH"> 
            </forms> 
           </authentication> 
           <authorization> 
            <deny users="?" /> 
           </authorization> 
          </system.web> 
         </location> 
    
  2. Utwórz stronę o nazwie "frontdoor.aspx". Pobierz zawartość tej strony aspx z tego linku: http://msdn.microsoft.com/en-us/library/xdt4thhy.aspx (przewiń w dół do miejsca, w którym jest napisane: "Aby utworzyć stronę logowania")

  3. WSZYSTKO ZOSTAŁO ZROBIONE! Spowoduje to zablokowanie całej witryny i pozwoli na określenie nazwy użytkownika i hasła (nazywam to procesem "blokowanie drzwi wejściowych") dla drzwi wejściowych niezależnie od reszty witryny.Przednie poświadczenia drzwi są określone w przedniej samego pliku drzwi (nie bardzo bezpieczne, ale wystarczająco dobre dla czego (my) muszą) w ten warunkowy:

    [Line 6:]

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

Zmodyfikuj warunki zależnie od potrzeb, a następnie prześlij pocztą e-mail klientów/firmy - wpisz dane uwierzytelniające do drzwi wejściowych.

+0

To rozwiązanie nie będzie działać, jeśli chcesz umożliwić dostęp do współpracowników firmy (z podstawowym loginem) podczas korzystania z kont testowych dla logowania opartego na formularzach. – Dementic

4

Występuję w tej samej sprawie. Będę umieszczać stronę beta ograniczoną do grupy podglądu. Witryna korzysta z uwierzytelniania formularzy, ale niektóre osoby z grupy podglądu będą miały konta internetowe, a inne nie. Niezależnie od tego wszyscy będą musieli uwierzytelnić się w katalogu głównym, aby uzyskać dostęp do podglądu.

Do tej pory jedyną rzeczą, która działa dokładnie tak, jak chcę, jest Helicon Ape. Prowadzę proces i do tej pory tak dobrze.

Standardowy plik .htaccess w katalogu głównym.

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

użytkownika .htpasswd dodać nazwę użytkownika i hasło: username:encryptedpassword.

+0

Czy trzymałeś się tego rozwiązania? Jakiekolwiek wady? – marapet

3

To, co opisujesz, jest ograniczeniem domyślnego środowiska ASP.NET, jest budowane tylko w celu uruchomienia jednego modułu uwierzytelniania naraz. Rozwiązaniem jest zbudowanie własnego IHttpModule, które wykonuje niestandardowe uwierzytelnianie, a jeśli się powiedzie, przekazanie żądania do ASP.NET, które nadal używa formularzy.

Poniżej przedstawiono podstawową implementację takiego modułu. Zwróci ona 401 Unauthorized i poprosi użytkownika o zalogowanie się do domeny WOPR. Następnie zaakceptuje hasło Joshua, ignorując podaną nazwę użytkownika.

Skompiluj to jako oddzielny zespół i dodaj go do swojego pliku web.config w sekcjach system.web/httpModules i system.webServer/modules. Nie jest wymagana żadna inna modyfikacja Twojej aplikacji internetowej.

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"; 
     } 
    } 
} 
Powiązane problemy