2009-09-14 8 views
11

J'ai un site Web qui utilise l'authentification et l'adhésion aux formulaires. Un utilisateur doit avoir des cookies activés pour utiliser le site. Il m'a été demandé de modifier le code afin que l'identifiant de session soit modifié dès qu'un utilisateur se connecte. Cela permettra de le protéger contre une attaque de fixation de session (http://en.wikipedia.org/wiki/Session_fixation). Est-ce que quelqu'un sait comment je peux changer l'identifiant de session sans perdre toute la session? PHP a une méthode spécifique pour le faire mais je ne trouve pas d'équivalent .NET.Comment modifier l'ID de la session après la connexion à ASP.net

Répondre

5

Here's a blog post qui parle de ceci:

ASP.NET ne prend pas en charge directement fonctionnalité pour régénérer une session ID. Voir la documentation concernant le numéro here. Il est un not-so quick and dirty way pour le faire par en définissant la valeur ASPNET_SessionID à la chaîne vide et en redirigeant ainsi que la valeur est régénérée.

+1

i ASLO pense à ce sujet, mais après Régénérer que, tout l'objet dans l'objet de la session va perdre ... – MemoryLeak

+1

Le L'article de blog auquel vous liez n'est plus disponible. –

6

J'ai répondu à une question similaire à Generating a new ASP.NET session in the current HTTPContext. Fondamentalement, nous devons modifier une partie de l'état interne de SessionStateModule pour pouvoir régénérer l'ID de session sans perdre d'objets dans la session. J'ai utilisé la réflexion pour définir le champ _rqId sur le nouvel ID et _rqSessionStateNotFound sur true. L'inconvénient est que nous devons accorder une "confiance totale" à l'application.

+2

La [réponse acceptée] (http://stackoverflow.com/a/1419508/295686) fait référence à un article ciblant .NET 1.1 (et ne traite pas réellement de la fixation de la session, mais seulement de l'ancienne réutilisation de l'ID de session), mais La solution était plus élégante et fonctionnait dans notre application .NET 4.5 (un site MVC et un site Web Forms). – mlhDev

1

C'est une question vraiment vieux je ressuscite, mais voici la solution:

var manager = new SessionIDManager(); 
bool redirected, isAdded; 
manager.SaveSessionID(System.Web.HttpContext.Current, 
    "5vonjb4mtb1of2fxvhjvkh5d", out redirected, out isAdded); 

// sessionId now equals "5vonjb4mtb1of2fxvhjvkh5d" 
var sessionId = Session.SessionID; 
+0

Je sais, ça fait longtemps. Mais nous avons essayé votre code et ça ne fonctionne pas pour nous. sessionId n'est pas égal à "5vonjb4mtb1of2fxvhjvkh5d". – mosquito87

+0

Je l'ai fait avec succès. sessionid est remplacé par le nouveau sessionid. – pinopino

+2

Cela nous a rapprochés mais pas assez proches - nous y travaillons encore. Cela met à jour l'ID de session et envoie la mise à jour des cookies comme vous le souhaitez, mais nous aimerions quand même utiliser la session pendant cette même requête. Nous ne sommes pas en mesure de faire cela maintenant - apparaît le sac de session est le précédent; la prochaine demande voit le nouveau sac de session mais nos valeurs ne sont pas là. – mlhDev

Questions connexes