2009-03-09 8 views
2

Ich arbeite auf einer Website mit einem internen und einem externen Abschnitt.Wie haben Sie mehrere Anmeldungen mit ASP.Net?

Die Benutzer für beide Abschnitte sind unterschiedlich und benötigen daher eine andere Anmeldeseite. Ich wollte die Authentifizierung für beide Ordner unterschiedlich konfigurieren, aber ASP.Net ist nicht erlaubt.

Beispiel (in meinem Haupt web.config):

<authentication mode="Forms"> 
    <forms loginUrl="~/Pages/Internal/Main.aspx" defaultUrl="~/Pages/Internal/Main.aspx" cookieless="UseDeviceProfile" name=".ApplicationAuthenticatedUser" path="/" protection="All" slidingExpiration="true" timeout="45"/> 
</authentication> 

Und im externen Unterordner, ich versuche, um die Einstellungen zu überschreiben:

<authentication mode="Forms"> 
    <forms loginUrl="~/Pages/External/Default.aspx" defaultUrl="~/Pages/External/Default.aspx" cookieless="UseDeviceProfile" name=".ApplicationAuthenticatedUser" path="/Pages/External" protection="All" slidingExpiration="true" timeout="45"/> 
</authentication> 

aber das gibt mir einen Fehler.

Ich habe versucht, beide in ihre Unterordner setzen, aber ich bekomme den gleichen Fehler, die Authentifizierung Konfigurationsabschnitt muss auf der Anwendungsebene festgelegt werden (ich vermute, das bedeutet die Stamm web.config).


Eine mögliche Lösung ist die Login-Seite zu zentralisieren und umleiten, je nachdem, wo die Anfrage kam, wenn es von einer externen Seite kommt, an der externen Login-Seite senden, sonst an den internen.

Es würde funktionieren, aber wenn es möglich ist, möchte ich die Lösung, wo ich dies in der web.config konfigurieren kann.

Dank

Antwort

1

Ich bin verwirrt? Warum zwei Benutzerdatenspeicher? Ich verstehe intern versus extern, aber wenn es sich um dieselbe Anwendung handelt, können Sie Rollen zuweisen, um Ihren internen Benutzern mehr Berechtigungen zu geben. Darüber hinaus können Sie Ihren internen Benutzern den Zugriff von zu Hause aus ohne VPN ermöglichen.

Auch wenn Sie zwei Geschäfte haben müssen, ist Ihre beste Wette die Anwendung duping. Es kann die genaue Anwendung sein, aber Sie legen es auf einen internen Server und einen externen Server. Dann können Sie die Benutzer an verschiedenen Standorten authentifizieren. Beachten Sie jedoch, dass Sie weiterhin Rollen benötigen, es sei denn, Sie kludeln die Anwendung auf.

Wenn Sie sich gegen zwei Geschäfte authentifizieren müssen, können Sie dies mit einem benutzerdefinierten Anbieter tun. Der ASP.NET Login-Modell ermöglicht die benutzerdefinierten Anbieter und es ist sehr leicht zu bauen: http://msdn.microsoft.com/en-us/library/f1kyba5e.aspx http://msdn.microsoft.com/en-us/library/aa479048.aspx

Nun, wenn Sie zu verschiedenen Seiten umleiten muss (Sie aus irgendeinem Grunde in diesem Modell stecken?), Können Sie möglicherweise tun es nach IP-Adresse. Es ist wahrscheinlich, dass Ihr internes Netzwerk ein 10-Punkt- oder 192-Punkt-IP-Schema verwendet. Wenn ja, werden diese Adressen an intern übertragen. Der Rest nach außen. Dazu müssen Sie etwas einrichten, das die Weiterleitung durchführt. Ich weiß, dass Sie dies auf der Anmeldeseite tun können, wenn nicht mit einem HTTP-Handler.

Dies scheint jedoch eine Menge Arbeit. Ich sehe immer noch nicht das Bild, warum du die Aufgabe auf diese Weise erfüllen musst.

+0

Ich habe nichts dagegen, den gleichen Benutzerdatenspeicher zu haben, ich möchte nur verschiedene Login-Seiten (und möglicherweise unterschiedliche Konfigurationen für beide wie das Ablauf-Timeout). – mbillard

0

Wenn Sie als zwei verschiedene IIS-Anwendungen ausführen können, dann können Sie verschiedene Authentifizierungsanbieter (oder verschiedene Instanzen des gleichen Provider ... möglicherweise die gleiche Datenbank mit dem Anwendungsattribut auf dem Provider zu unterscheiden).

Aber verschiedene Web-Apps bedeutet kein gemeinsamer Status (Anwendung und Sitzung) und duplizieren die Installation. Für ein Intranet/Internet würde dies erlauben, dass die externe Bereitstellung keine Komponenten enthält, auf die kein Internetbenutzer zugreifen kann (und somit die Sicherheit durch Verringern der Oberfläche verbessern).

Andernfalls könnten Sie einen benutzerdefinierten Authentifizierungsanbieter benötigen, die in denjenigen zu einem der integrierten leitet je nachdem, wer in einloggt.

+0

Es ist eine Möglichkeit, aber ich verliere zu viel, indem ich das tue. – mbillard

0

Wenn Ihre Website eine einzelne Web-Anwendung ist, könnten Sie wahrscheinlich den ASP.NET verwenden Rollenanbietermodell mit zwei Rollen, einer für interne und einer für externe Seiten (Sie können diesen PR-Ordner mit dem <Standort> Konfigurationselement konfigurieren).

Weitere Informationen finden Sie http://msdn.microsoft.com/en-us/library/9ab2fxh0.aspx

+0

Ich habe das, ich möchte nur eine Möglichkeit, Benutzer automatisch umleiten, die auf eine externe Seite zugreifen, um die externe Anmeldung. – mbillard

0

Ich habe eine einfache Möglichkeit, dies zu handhaben, die für jemanden von Nutzen sein könnte. Ich möchte im Grunde denselben Code für einen Gast-Login und einen registrierten Benutzer verwenden können. Ich habe auch eine mobile Version der Website, die ich an eine andere Anmeldeseite senden möchte, wenn das Authentifizierungsticket abläuft.

Wahrscheinlich nicht die eleganteste Lösung, aber einfach genug:

Public Sub btnSubmit_Click(ByVal sender As Object, ByVal e As EventArgs) 
     If Page.IsValid Then 
      Dim userLogin As String = "" 

      userLogin = System.Guid.NewGuid.ToString 
      FormsAuthentication.RedirectFromLoginPage(userLogin, False) 
      ' place a url param throughout my app, only four pages so no 
      ' big problem there in this case g stands for guest   
      Response.Redirect("menu.aspx?m=g", False) 

     End If 
End Sub 

Dann in Global.asax:

Protected Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As System.EventArgs) 

     If Not Request.IsAuthenticated And _ 
(Not Request.RawUrl.ToLower.Contains("guestlogin.aspx")) And _ 
(Not Request.RawUrl.ToLower.Contains("registeredlogin.aspx")) And _ 
(Not Request.RawUrl.ToLower.Contains("mobilelogin.aspx")) Then 
      Response.Redirect("spLogin.aspx?m=" & Request.QueryString("m")) 
     End If 

    End Sub 

Dann in Ihrer Login-Seite (das in Ihrem Web angegeben. config):

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
      If Not Page.IsPostBack Then 
    if request.querystring("m")="g" then 
        Response.Redirect("guestlogin.aspx?m=g") 

    elseif request.querystring("m")="r" then 
        Response.Redirect("registeredlogin.aspx?m=r") 
    elseif request.querystring("m")="m" then 
        Response.Redirect("mobilelogin.aspx?m=m") 

end if 
End If 
End Sib