2009-04-14 10 views
15

Gibt es eine Möglichkeit, die LoginUrl von FormsAuthentication dynamisch zu ändern? Was ich habe, ist die ganze Site, die durch FormsAuth geschützt wird, aber für einige Seiten in einem Unterordner möchte ich den Benutzer zu einer anderen Anmeldeseite führen und FormsAuth den ReturnUrl-Kram behandeln lassen. Ist das möglich oder muss ich meinen eigenen Redirect-Code für die Untermappen-Fälle schreiben?So überschreiben/ändern Sie FormsAuthentication LoginUrl in bestimmten Fällen

Hier ist ein Beispiel-Layout:

~/LogOn1.aspx 
    ~/Protected1.aspx 
    ~/Protected2.aspx 
    ~/Subfolder/ 
    ~/Subfolder/LogOn2.aspx 
    ~/Subfolder/NotProtected.aspx 
    ~/Subfolder/Protected3.aspx 

Also meine web.config wie folgt aussieht:

<forms loginUrl="~/Splash.aspx" ... /> 

alle geschützten * ASPX-Seiten haben

<deny users="?"> 

Was ich d ist wie, obwohl ~/Unterordner/Protected3.aspx zu ~/Unterordner/LogOn2.aspx umgeleitet werden, wenn der Benutzer anonym ist.

Ich habe versucht, in ~/Subfolder/web.config eine abgespeckte Version von web.config setzen:

<?xml version="1.0"?> 
<configuration> 
    <system.web> 
     <authentication mode="Forms"> 
     <forms loginUrl="~/Subfolder/LogOn.aspx" name="SiteAuth" protection="All" timeout="30" path="/" defaultUrl="~/Subfolder/default.aspx" requireSSL="true" cookieless="UseCookies" enableCrossAppRedirects="false" /> 
     </authentication> 
     <authorization> 
     <deny users="?" /> 
     </authorization> 
    </system.web> 
</configuration> 

Aber alles, was mir bekommt, ist dieser Fehler:

It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

Ich denke, Den Unterordner dir zu einer Anwendung zu machen würde an dieser Stelle noch mehr Probleme verursachen, aber vielleicht liege ich falsch. Wenn es eine Anwendung wäre, würde das nicht den gesamten Code in ~/Unterordner vom Rest der Eltern-App trennen?

+0

Wenn Sie dynamisch sagen, wollen Sie nur einige Seiten im Unterordner zu bestimmten Zeiten auf die Login-URL umleiten? Oder möchten Sie, dass alle Seiten in einem Unterordner ständig auf eine Login-URL umgeleitet werden? – rahkim

+0

Ich habe einige Seiten im Unterordner, die anonymen Zugriff erlauben, so dass diese nicht umgeleitet werden müssen. Aber Seiten im Unterordner, die deny = "?" Ich möchte nach ~/subfolder/LogOn.aspx weitergeleitet werden, wo der Rest der geschützten Seiten der Seite außerhalb des Unterordners zu ~/LogOn.aspx umgeleitet wird. – slolife

+0

Hat der Link geholfen? – rahkim

Antwort

10

Das Problem, das Sie haben sind, ist, dass die Forms element nur auf der Anwendungsebene erlaubt ist - Sie können es in einem Unter nicht definieren können web.config.

Leider können Sie es auch nicht mit einer Location element definieren, und die FormsAuthentication.LoginUrl Eigenschaft ist schreibgeschützt.

Wenn Sie ein wenig herumjagen, ist es am besten, Code auf Ihrer Anmeldeseite zu haben, der erkennt, woher der Benutzer gekommen ist (z. B. durch Überprüfen des Werts der "ReturnUrl" -Abfragezeichenfolge) und weiterleiten zu Ihre andere Anmeldeseite, wenn sie aus dem Unterverzeichnis stammen. Allerdings gebe ich zu, dass dies nicht gut skaliert, wenn Sie benutzerdefinierte Anmeldeseiten für mehrere Unterverzeichnisse möchten. :(


In repsonse auf Ihre bearbeiten - ja, so dass das Unterverzeichnis eine Anwendung würde „lösen“ diesen Fehler, aber wie Sie darauf hinweisen, würden Sie dann mehr Probleme haben, wie Sie benötigen würde um alle relevanten Binaries, app_code, zu verschieben, was auch immer du in diesem Unterordner hast, ist es nicht wirklich eine Lösung

5

Jeder Unterordner ermöglicht Ihnen eine separate Webconfig-Datei. So könnten Sie eine web.config in Ihrem Unterordner mit den Tags setzen:

<authentication mode="Forms"> 
    <forms loginUrl="~/Subfolder/LogOn2.aspx" /> 
</authentication> 
+2

Fehler bekomme ich, wenn ich die abgespeckte web.config in Unterordner setzen: Es ist ein Fehler, einen Abschnitt zu verwenden, der als allowDefinition = registriert ist 'MachineToApplication' über die Anwendungsebene hinaus. Dieser Fehler kann durch ein virtuelles Verzeichnis verursacht werden, das nicht als Anwendung in IIS konfiguriert ist. – slolife

+0

Oh ... Ich hätte klarer sein sollen. Sie sollten eine reguläre web.config in den Unterordner einfügen. Achten Sie darauf, dass Sie das Tag zur Authentifizierung hinzufügen. – rahkim

+0

Hier ist ein Beispiel für die Verwendung mehrerer Konfigurationen - http://www.codeproject.com/KB/aspnet/multipleWebConfig.aspx – rahkim

7

Ich hatte dieses Problem auch und habe gerade hier gegoogled versucht es zu lösen dann erinnerte ich mich getan es vor langer Zeit und was ich getan habe war in der Standard-login.aspx Seite im Stammordner in der Page_Load -Ereignis Ich habe eine Weiterleitung basierend auf Return-URL zu meinem Unterverzeichnis verwalten und seine login.aspx Seite! Sie müssten die wiederholen relevantes Bit für jedes Unterverzeichnis.

public void Page_Load(object sender, EventArgs e) 
{ 
//check for existence of ReturnUrl in QueryString  
    //if it contains manage redirect to manage login page 
    if (!String.IsNullOrEmpty(Request.QueryString["ReturnUrl"])) 
    { 
     if (Request.QueryString["ReturnUrl"].Contains("manage")) 
     { 
      Response.Redirect("manage/login.aspx"); 

     } 
    } 
} 
+0

Große Antwort, löste mein Problem! Die einzige Sache, die ich hinzufügen würde, ist, dass die web.config offensichtlich Benutzer Benutzern erlauben würde, Unteranmeldeunterseiten zuzugreifen, also Sie eine rekursive Umleitung zwischen der grundlegenden Anmeldeseite und der Unterverzeichnisanmeldungsseite nicht erhalten. –

Verwandte Themen