Domanda

Sto usando un HttpModule per riscrivere gli URL su un sito multilingue. In HttpModule, sto aggiungendo un gestore per l'evento BeginRequest e sto cercando la prima parte del percorso che contiene il nome della cultura.

Ad esempio, /fr-ca/index.aspx verrà riscritto in /index.aspx e imposta la cultura del thread e la cultura dell'interfaccia utente su 3084. Funziona bene.

Inserisci autenticazione moduli. L'autenticazione dei moduli funziona ancora bene con l'URL non mappato, ma se l'utente non è autorizzato, reindirizzerà a loginUrl come impostato nella sezione di autenticazione di web.config e includerà il parametro? ReturnUrl = querystring per gestire il reindirizzamento al richiesto pagina dopo l'autenticazione dell'utente.

Ci sono due problemi qui se l'utente richiede una pagina in una lingua diversa da quella predefinita:

  1. loginUrl ignora il percorso prima che venga riscritto
  2. Anche il parametro ReturnUrl ha ignorato il percorso non elaborato.

È equivalente a Request.Url.PathAndQuery invece di Request.RawUrl.

Non posso invece passare alla pipeline durante l'evento AuthorizeRequest perché allora dovrei proteggermi da tutti i possibili valori di cultura, perché sto usando un file web.config con più percorsi di posizione. Anche questo non risolve il primo problema.

Ho esaminato il modulo FormsAuthentication in reflector e vedo dove potrei cambiarlo per risolvere il n. 1 e il n. 2, ma ovviamente è sigillato.

Ho anche esplorato molto, ma non riesco a vedere alcuna soluzione praticabile.

FormsAuthenticationModule sta verificando un'intestazione 401 generata in UrlAuthorizationModule. Se cerchi il referrer (che è vuoto) nella pagina loginUrl lo conferma.

Qualche idea?

MODIFICA N. 1

Sto usando IIS 6 e IIS 7 non è un'opzione.

MODIFICA N. 2

La pagina di accesso non stava rilevando la cultura predefinita / cultura dell'interfaccia utente perché quando ho generato la risorsa locale (vista di progettazione: Strumenti > Genera risorsa locale), l'IDE ha aggiunto quanto segue alla direttiva della pagina:

&

cultura = quot; auto quot &; meta: &; & ResourceKey = quot PageResource1 quot; & Uiculture = quot; auto quot &;

Stai attento con questo in vs.net 2008! Almeno questo risolve uno dei problemi con la cultura di default a cui non si fa riferimento, ma # 1 e # 2 sono ancora in sospeso.

MODIFICA 3

Speravo di poter saltare in uno degli eventi della pipeline per eseguire il mio reindirizzamento, ma nel metodo Reflecting the System.Web.Security.UrlAuthorizationModule OnEnter ho appreso che una volta impostata l'intestazione 401, il metodo chiama applicazione. CompleteRequest, che come puoi immaginare, ci porta direttamente all'evento EndRequest. Questo è ciò che fa il modulo FA nel fare il reindirizzamento e temo di non poter saltare davanti per fare il mio reindirizzamento! Sono sorpreso che non ci siano più persone che si imbattono in questo problema o forse non hanno ancora risposto.


Esempio:

Ho una sezione di un membro nella cartella fisica / membri / che è protetta dall'autenticazione dei moduli.

Nel web.config, ho:

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

e ...

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

Quando un utente non autenticato richiede la pagina dell'indice di / members /, viene reindirizzato a loginUrl dalla sezione di autenticazione sopra da FormsAuthenticationModule. Aggiunge inoltre il parametro? ReturnUrl con la pagina richiesta.

Funziona bene se un utente sta visitando il sito Web utilizzando la cultura predefinita, ma il mio HttpModule imposta la cultura in base alla presenza di un nome di cultura nella prima parte del percorso.

Quindi, /fr-ca/members/index.aspx viene riscritto in /members/index.aspx e imposta la cultura / cultura dell'interfaccia utente sul francese canadese. Purtroppo, FormsAuthenticationModule invia l'utente alla pagina loginUrl con l'URL riscritto, non l'originale. Pertanto, l'impostazione della cultura viene persa e l'URL di reindirizzamento non è corretto.

Spero cheaiuta @Greg

È stato utile?

Soluzione

Ok, problema risolto.

Si scopre che la chiave stava cancellando i moduli http machine.config, aggiungendo il mio modulo http personalizzato, quindi aggiungendo nuovamente i moduli http predefiniti richiesti. Ciò ha consentito al mio httpModule personalizzato di saltare all'evento EndRequest prima del FormsAuthenticationHttpModule.

<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> 

Quindi, nel mio httpModule personalizzato, basta toccare l'EndRequest, cercare il codice di stato 401 e reindirizzare come desidero. Fondamentalmente sto riscrivendo il codice dal metodo FormsAuthenticationHttpModule OnLeave per soddisfare le mie esigenze.

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

Altri suggerimenti

L'unica cosa che mi viene in mente è fare il reindirizzamento al modulo di login manualmente.

1) Consenti tutto l'accesso alla directory di appartenenza
2) Tutte le pagine dell'appartenenza ereditano direttamente da una sottoclasse di Page.
3) In PreInit (?) Della sottoclasse Pagina, controlla se l'utente è membro del ruolo di appartenenza.
4) In caso contrario, crea tu stesso l'URL della pagina di accesso, incluso il parametro ReturnURL e reindirizza l'utente al tuo URL di accesso.

Potresti anche essere in grado di hackerarlo mettendo un mucchio di < posizione gt &; sezioni nel tuo web.config. es: < percorso percorso = " fr-ca / members " > < authenication gt &; lt &; forme loginUrl = " ~ / fr-ca / members / login.aspx " > ... ma non ne ho davvero idea.

Probabilmente ci sono altri modi per farlo che non ho familiarità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top