Frage

Ich bin mit einem Httpmodule die URLs auf einer mehrsprachigen Website neu zu schreiben. In der Httpmodule, bin ich das Hinzufügen eines Handler für das Ereignis Beginrequest und die Suche nach dem ersten Teil des Pfades, der den Kulturnamen enthält.

Zum Beispiel wird /fr-ca/index.aspx neu geschrieben werden, um die Kultur und ui Kultur Thread zu 3084. In der /index.aspx und setzt Dies funktioniert gut.

Geben Sie die Formularauthentifizierung. Formularauthentifizierung funktioniert immer noch gut mit den nicht zugeordneten URL, aber wenn der Benutzer nicht autorisiert ist, wird es auf die loginUrl umleiten, wie in dem Authentifizierungs-Abschnitt der web.config festgelegt und umfassen das? ReturnUrl = Abfragezeichenfolgeflag Parameter Umleitung auf die gewünschte Handhabung zurück Seite, sobald der Benutzer authentifiziert wird.

Es gibt zwei Probleme, wenn der Benutzer eine Seite in einer anderen Sprache als der Standard fordert:

  1. Die loginUrl ignoriert den Weg, bevor es neu geschrieben
  2. Der ReturnUrl Parameter auch den rohen Pfad ignoriert.

Es ist äquivalent zu Request.Url.PathAndQuery statt Request.RawUrl.

Ich kann nicht an dem AuthorizeRequest Ereignisse statt in die Pipeline springen, denn dann würde ich gegen alle möglichen Kulturwerte zu schützen, weil ich mit mehreren Standortpfaden eine Datei web.config bin mit. Dies ist auch nicht das erste Problem beheben.

Ich habe durch die FormsAuthenticationModule Reflektor weg und ich sehe, wo ich es # 1 und # 2, zu lösen ändern könnte, aber es ist natürlich versiegelt.

Ich habe auch viel herumgeblättert, aber ich kann keine praktikable Lösungen nicht sehen.

Die FormsAuthenticationModule prüft für einen 401-Header, der in UrlAuthorizationModule erzeugt wird. Wenn Sie die Referrer aussehen (was leer ist) auf der loginUrl Seite es wird bestätigt, dass.

Alle Gedanken?

EDIT # 1

Ich bin mit IIS 6 und IIS 7 ist keine Option.

EDIT # 2

Die Anmeldeseite wurde nicht die Standardkultur / ui Kultur Kommissionierung, weil, wenn ich die lokale Ressource (Entwurfsansicht: Werkzeuge> Generieren Lokale Ressource) erzeugt, die IDE die folgenden auf die Seite Richtlinie hinzugefügt:

Kultur = "auto" Meta: ResourceKey = "PageResource1" Uiculture = "auto"

Seien Sie mit diesem in vs.net 2008 vorsichtig! Zumindest eines der Probleme mit der Standardkultur löst nicht verwiesen wird, aber # 1 und # 2 sind noch ausstehend.

EDIT 3

Ich hoffte, dass ich in einer der Pipeline Ereignisse springen konnte meine eigene Umleitung zu tun, aber die System.Web.Security.UrlAuthorizationModule OnEnter Methode in Reflektierende, habe ich gelernt, dass, sobald die 401-Header gesetzt ist, wird die Methode Anwendung aufruft. CompleteRequest, die, wie Sie sich vorstellen können, uns direkt auf die Endrequest-Ereignis bringt. Dies ist, was das FA-Modul springt in denen die Umleitung tun, und ich fürchte, ich nicht vor springen kann meine eigene Umleitung zu tun! Ich bin überrascht, dass es nicht mehr Menschen in dieser Frage kommen, oder vielleicht haben sie noch nicht da läutet.


Beispiel:

Ich habe einen Abschnitt in den physischen Ordner / Mitglieder-Mitglied / das durch Formularauthentifizierung geschützt ist.

In der web.config, ich habe:

<authentication mode="Forms">
  <forms loginUrl="~/members/login.aspx" timeout="40" />
</authentication>

und ...

  <location path="members">
      <system.web>
          <authorization>
              <deny users="?" />
              <allow roles="Members" />
              <deny users="*" />
          </authorization>
      </system.web>
  </location>

Wenn ein nicht authentifizierter Benutzer die Indexseite / Mitglieder anfordert /, werden sie an den loginUrl von dem Authentifizierungs-Abschnitt oben durch die FormsAuthenticationModule umgeleitet. Es hängt auch? ReturnUrl Parameter mit der angeforderten Seite.

Dies funktioniert nur gut, wenn ein Benutzer auf die Website ist das Surfen im Standardkultur mit, aber meine Httpmodule setzt die Kultur auf der Grundlage der Anwesenheit eines Kulturnamen im ersten Teil des Pfades.

So /fr-ca/members/index.aspx wird neu geschrieben /members/index.aspx und setzt die Kultur / ui Kultur Kanadisches Französisch. Unforunately sendet die FormsAuthenticationModule die Benutzer auf die loginUrl Seite mit der umgeschriebenen URL, nicht das Original. So wird die Kultureinstellung verloren und die Umleitungs-URL ist falsch.

Ich hoffe, das @ Greg

hilft
War es hilfreich?

Lösung

Ok, Problem gelöst.

Schaltet den Schlüssel aus klarte der machine.config Httpmodules, meine Gewohnheit httpmodule Zugabe, dann wieder die erforderliche Zugabe von Standard-Httpmodules. Dies ermöglichte es meine Gewohnheit httpmodule in das Endrequest-Ereignis vor dem FormsAuthenticationHttpModule zu springen.

<httpModules>
    <clear/>
    <!-- custom -->
    <add name="LocalizationHttpModule" type="LocalizationHttpModule"/>
    <!-- add back defaults, exlude PassportAuthentication, AnonymousIdentification, Profile -->
    <add name="OutputCache" type="System.Web.Caching.OutputCacheModule" />
    <add name="Session" type="System.Web.SessionState.SessionStateModule" />
    <add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule" />
    <add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule" />
    <add name="RoleManager" type="System.Web.Security.RoleManagerModule" />
    <add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule" />
    <add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule" />

</httpModules> 

Dann in meiner benutzerdefinierten httpmodule, ich tippen Sie einfach in die Endrequest, suchen Sie nach dem Statuscode 401, und umleiten, wie ich will. Im Grunde bin ich den Code aus dem FormsAuthenticationHttpModule OnLeave Methode Umschreiben auf meine Bedürfnisse anzupassen.

Public Sub Init(ByVal context As System.Web.HttpApplication) Implements System.Web.IHttpModule.Init

    Dim authentication As AuthenticationSection = WebConfigurationManager.GetSection("system.web/authentication")
    If authentication.Mode = AuthenticationMode.Forms Then
        Me._LoginUrl = authentication.Forms.LoginUrl
        AddHandler context.EndRequest, AddressOf Context_EndRequest
    End If

End Sub

Private Sub Context_EndRequest(ByVal sender As Object, ByVal e As EventArgs)
    Dim application As HttpApplication = DirectCast(sender, HttpApplication)
    Dim context As HttpContext = application.Context

    If (context.Response.StatusCode = &H191) Then                
       ' do custom redirect here
    End If

End Sub

Andere Tipps

Über das einzige, was ich denken kann, ist die Umleitung auf die Login-Formular tun manuell.

1) Lassen Sie den gesamten Zugriff auf Mitgliederverzeichnis
2) Alle Seiten in der Mitgliedschaft direkt von einer Unterklasse von Seite erben.
3) In PreInit (?) Der Seite der Unterklasse, um zu sehen, wenn der Benutzer Mitglied der Mitgliedschaft Rolle ist.
4) Wenn nicht, bauen URL der Login-Seite selbst, einschließlich ReturnURL Parameter und leiten Benutzer auf Ihre Login-URL.

Sie können auch in der Lage sein, dies zu hacken, indem eine eine Reihe von Abschnitte in Ihrem web.config setzen. Bsp.: ... aber ich habe wirklich keine Ahnung,

Es gibt wahrscheinlich auch andere Möglichkeiten, es zu tun, dass ich nicht vertraut bin.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top