In het topic \[ASP.Net] asp.net threadsafe maken heb ik het gehad over problemen met het threadsafe maken van bepaalde code.
Inmiddels ben ik er achter dat mijn code reuze threadsafe was, en dat hier niet het probleem zat.
Het probleem is nu iets anders geworden, maar niet minder complex.
Ik heb een loadbalancer waarvan ik weet dat hij soms midden in een sessie mij van node A naar node B gooit.
Op beide nodes heb ik mijn asp.net applicatie geinstalleerd.
- Ik heb IIS zo geconfigureerd dat ik NTLM gebruik voor authenticatie.
- Mijn sessies zijn in proc (wat betekend dat IIS van node A niet weet wat de IIS van node B aan sessie ID uitgeeft. In theorie kunnen ze dezelfde uitgeven)
- Ik heb een loadbalancer die stiekum een proxy is (HAproxy)
Nu is het probleem dat ik soms (als ik net van node gewisselt ben) informatie zie van andere gebruikers.
Het lijkt er dus op dat IIS denkt dat ik gebruiker1 ben terwijl ik daadwerkelijk gebruiker2 ben.
Ik dacht in de eerste instantie dat IIS dan hetzelfde sessieID gebruikt op beide servers, en op het moment dat je switched je dus toevallig in de sessie van een ander komt.
Ik zit dit trouwens doordat ik in mijn applicatie de volgende code aanroep
Dit zou echter impliceren dat:
- IIS de username (via bovenstaande code op te vragen) cached in je sessie, en dus niet elke keer echt naar AD gaat.
- De session ID's zo verschrikkel niet-generiek zijn dat het heeeeel vaak voorkomt dat beide nodes dezelfde id's hebben.
Even ter referentie: Wij hebben misschien 50 gebruikers die heel af-en-toe wat doen. Dus qua kansberekening zou je zeggen dat de (ik dacht) 24 tekens van het ASP.NET sessie ID vrij uniek moeten zijn en dat die kans HEEEEEEEL klein zou moeten zijn.
In de praktijk komt het echter meerdere keren per dag voor.
Zodoende twijfel ik heel erg of dit wel echt de oorzaak van het probleem is.
Op deze pagina word verwezen naar een microsoft document (Authentication Options and Limitations Using Proxy Server 2.0). Daarin staat het volgende:
"The HTTP 1.1 specification states that all state is hop-by-hop only. End- to-end state can be achieved using a cookie or some other token distinct from HTTP"
"In summary, Basic authentication does not require an implicit end-to-end state, and can therefore be used through a proxy server. Windows NT Challenge/Response authentication requires implicit end-to-end state and will not work through a proxy server."
Zodoende zit ik een beetje te denken dat er meer aan de hand is dan die sessies die toevallig hetzelfde zouden zijn.
Echter ben ik niet bekend genoeg met het HTTP1/1 protocol en NTLM.
Is implementeren van Kerberos genoeg om dit probleem op te lossen? hoe makkelijk is dat in IIS? (vinkje heet 'windows authentication')
en moet ik dan mijn applicatie nog ombouwen?
Inmiddels ben ik er achter dat mijn code reuze threadsafe was, en dat hier niet het probleem zat.
Het probleem is nu iets anders geworden, maar niet minder complex.
Ik heb een loadbalancer waarvan ik weet dat hij soms midden in een sessie mij van node A naar node B gooit.
Op beide nodes heb ik mijn asp.net applicatie geinstalleerd.
- Ik heb IIS zo geconfigureerd dat ik NTLM gebruik voor authenticatie.
- Mijn sessies zijn in proc (wat betekend dat IIS van node A niet weet wat de IIS van node B aan sessie ID uitgeeft. In theorie kunnen ze dezelfde uitgeven)
- Ik heb een loadbalancer die stiekum een proxy is (HAproxy)
Nu is het probleem dat ik soms (als ik net van node gewisselt ben) informatie zie van andere gebruikers.
Het lijkt er dus op dat IIS denkt dat ik gebruiker1 ben terwijl ik daadwerkelijk gebruiker2 ben.
Ik dacht in de eerste instantie dat IIS dan hetzelfde sessieID gebruikt op beide servers, en op het moment dat je switched je dus toevallig in de sessie van een ander komt.
Ik zit dit trouwens doordat ik in mijn applicatie de volgende code aanroep
C#:
1
| var loginName = HttpContext.Current.User.Identity.Name |
Dit zou echter impliceren dat:
- IIS de username (via bovenstaande code op te vragen) cached in je sessie, en dus niet elke keer echt naar AD gaat.
- De session ID's zo verschrikkel niet-generiek zijn dat het heeeeel vaak voorkomt dat beide nodes dezelfde id's hebben.
Even ter referentie: Wij hebben misschien 50 gebruikers die heel af-en-toe wat doen. Dus qua kansberekening zou je zeggen dat de (ik dacht) 24 tekens van het ASP.NET sessie ID vrij uniek moeten zijn en dat die kans HEEEEEEEL klein zou moeten zijn.
In de praktijk komt het echter meerdere keren per dag voor.
Zodoende twijfel ik heel erg of dit wel echt de oorzaak van het probleem is.
Op deze pagina word verwezen naar een microsoft document (Authentication Options and Limitations Using Proxy Server 2.0). Daarin staat het volgende:
"The HTTP 1.1 specification states that all state is hop-by-hop only. End- to-end state can be achieved using a cookie or some other token distinct from HTTP"
"In summary, Basic authentication does not require an implicit end-to-end state, and can therefore be used through a proxy server. Windows NT Challenge/Response authentication requires implicit end-to-end state and will not work through a proxy server."
Zodoende zit ik een beetje te denken dat er meer aan de hand is dan die sessies die toevallig hetzelfde zouden zijn.
Echter ben ik niet bekend genoeg met het HTTP1/1 protocol en NTLM.
Is implementeren van Kerberos genoeg om dit probleem op te lossen? hoe makkelijk is dat in IIS? (vinkje heet 'windows authentication')
en moet ik dan mijn applicatie nog ombouwen?
This message was sent on 100% recyclable electrons.