2016-04-22 17 views
8

La nostra applicazione Web ASP.NET MVC ha alcuni sottodomini diversi che utilizziamo per test e codice legacy. I sottodomini sono:Come condividere cookie tra dominio e sottodominio, ma non altri sottodomini

  1. www.sitename.com (sito produttivo)
  2. test.sitename.com (testing)
  3. original.sitename.com (codice legacy)
  4. staging.sitename.com (utilizzato occasionalmente per test prima dell'implementazione)

Abbiamo l'autenticazione dei moduli che non utilizza i cookie a livello di dominio perché vogliamo che i cookie siano univoci tra questi diversi sottodomini. Il problema è che quando gli utenti ottengono un collegamento al dominio principale (sitename.com), richiede loro di accedere di nuovo per ottenere un cookie, anche se sono già connessi a www.sitename.com.

C'è un modo per condividere il cookie tra solo www.sitename.com e sitename.com senza che gli altri sottodomini siano interessati?

+1

è possibile reindirizzare tutto sitename.com a www.sitename.com o viceversa per non avere questo tipo di problema. –

+0

Come potrei fare per farlo? –

risposta

3

mi consiglia di forzare l'utilizzo di il www. versione del sito, per questo motivo tra gli altri, questo sito ha ottime ragioni per cui ...

http://www.yes-www.org/why-use-www/

Per fare questo in .NET è possibile aggiungere quanto segue al file web.config

<system.webServer> 
    <rewrite> 
    <rules> 
     <rule name="Redirect to www" stopProcessing="true"> 
     <match url="(.*)" /> 
     <conditions trackAllCaptures="false"> 
     <add input="{HTTP_HOST}" pattern="^sitename.com$" /> 
     </conditions> 
     <action type="Redirect" url="{MapProtocol:{HTTPS}}://www.{HTTP_HOST}{HTTP_URL}" redirectType="Permanent"/> 
     </rule> 
    </rules> 
    <rewriteMaps> 
     <rewriteMap name="MapProtocol"> 
     <add key="on" value="https" /> 
     <add key="off" value="http" /> 
     </rewriteMap> 
    </rewriteMaps> 
    </rewrite> 
</system.webServer> 

Questa volontà automatico reindirizzare in modo permanente (vedi l'aggiunta di redirectType = "permanente") per gli URL non www al www equivalente e mantenere l'http (s) protocollo

la parte trackAllCaptures è legato al pattern matching regex - in il nostro c come noi non abbiamo bisogno di catturare nulla, abbiamo solo bisogno di corrispondere per la regola, quindi possiamo lasciare come falso.

Il modello di espressione regolare^sitename.com $ corrisponderà quando il nome host corrisponde esattamente a "sitename.com" - il^significa che la posizione di partenza e il $ indica la posizione finale

La mappa riscrittura è da un Credo che l'idea di Jeff Graves, http://jeffgraves.me/2012/11/06/maintain-protocol-in-url-rewrite-rules/

Il modo in cui ho mostrato mostra un solo modo per farlo, come con la maggior parte delle cose - ci sono molti modi per raggiungere questo obiettivo.

Scott Forsyth ha un articolo su diverso modo di raggiungere questo (fa riferimento anche Jeff Graves) http://weblogs.asp.net/owscott/url-rewrite-protocol-http-https-in-the-action

+0

. Ho notato che la tua risposta differisce da quella di Ergun in quanto il nodo delle tue condizioni ha 'trackAllCaptures =" false "'. Di cosa si tratta? –

+0

trackAllCaptures viene utilizzato per la regex per definire se la stringa corrispondente deve essere inclusa negli indici dei risultati - è possibile trovare ulteriori dettagli a riguardo qui http://www.iis.net/learn/extensions/url-rewrite-module/url -rewrite-module-20-riferimento-configurazione # Using_back-references_in_rewrite_rules - stiamo solo cercando il nome host e non siamo interessanti nel catturare qualcosa così possiamo lasciarlo come falso – Sean

5

È possibile evitare questo problema reindirizzando il dominio non www a www con modulo URLRewrite in> IIS7

regola di riscrittura di mettere in web.config

<system.webServer> 
<rewrite> 
    <rules> 
     <rule name="Redirect to WWW" stopProcessing="true"> 
     <match url=".*" /> 
     <conditions> 
      <add input="{HTTP_HOST}" pattern="^example.com$" /> 
     </conditions> 
     <action type="Redirect" url="http://www.example.com/{R:0}" 
      redirectType="Permanent" /> 
     </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 
+0

Perdonami se questa è una domanda stupida, ma non 'pattern ="^esempio.com $ "' raccogli, ad esempio, test.example.com? –

+0

"www" è un altro sottodominio e non diverso da test.example.com per questo modello. il modello è corretto per l'indirizzo non di sottodominio che è solo "esempio.com" –

0

si può usare qualche cosa come

sessionCookie.Domain = ".yourdomain.com" ; 

allora si sarà in grado di richiedere stessi cookie da qualsiasi sottodominio e modificarlo se lo desideri.

+1

La risposta sta chiedendo in particolare un modo per non condividere il cookie su tutti i sottodomini, ma solo su quelli specifici. – ArcSine

Problemi correlati