Puis-je abandonner une session InProc ASP.NET à partir d'une session différente de celle qui effectue la demande?

StackOverflow https://stackoverflow.com/questions/257843

Question

Nous avons une application qui effectue une connexion unique à l'aide d'un serveur d'authentification centralisé (CAS). Nous aimerions utiliser la déconnexion unique. Par exemple, si l'utilisateur se déconnecte d'une application (par exemple, un portail frontal), il est automatiquement déconnecté de toutes les applications à l'aide du même ticket d'authentification unique.

On s’attend à ce que chaque application enregistre une connexion (URL) avec le CAS au moment de la connexion à cette application. Lorsque le serveur CAS reçoit la demande de déconnexion de l'une des applications, il appelle le hook de déconnexion pour toutes les applications partageant le ticket SSO.

Ma question est la suivante: existe-t-il un moyen d'abandonner une session InProc à partir d'une session différente? Étant donné que la requête HTTP proviendra du serveur CAS, je suppose que celui-ci obtiendra sa propre session, mais que c’est la session de l’utilisateur que je souhaite terminer. J'ai une bonne idée de la procédure à suivre en utilisant un serveur d'état de session distinct, mais j'aimerais savoir s'il est possible d'utiliser l'état de session InProc.

Était-ce utile?

La solution 2

Après avoir un peu fouillé et examiné les réponses fournies jusqu’à présent, j’ai trouvé une alternative qui me permet de continuer à utiliser la session InProc. En gros, il consiste à étendre le HttpModule qui gère déjà la connexion unique aux sorties de connexion détectées et redirige le navigateur vers la page de déconnexion de l'application.

Contour:

Connexion:

  1. Pour chaque nouvelle demande d'authentification unique, créez un nouveau cookie SSO et indiquez-y une valeur unique pour identifier la session (et non l'ID de session, afin d'éviter toute fuite).
  2. Construisez l'URL de rappel de déconnexion, codée avec l'identifiant, et enregistrez-la auprès du serveur CAS.

Déconnexion:

  1. Lorsqu'une demande de déconnexion est reçue du serveur CAS, décodez l'identificateur et stockez-le dans un cache à l'échelle de l'application. Cela doit être épinglé dans le cache au moins assez longtemps pour que la session expire naturellement.
  2. Pour chaque demande, recherchez le cookie SSO et vérifiez sa valeur par rapport aux identificateurs de session mis en cache et mis en cache. Si cela se produit, supprimez le cookie SSO et redirigez le navigateur vers l'URL de déconnexion de l'application.
  3. Pour chaque déconnexion, vérifiez s'il existe un cookie SSO. Dans l'affirmative, transmettez la demande de déconnexion à la CAS. Dans tous les cas, quittez la session de l'utilisateur et déconnectez-la de l'application.

Page_Load:

  1. Vérifiez la présence du cookie SSO. S'il n'y en a pas, redirigez-vous vers la page de déconnexion.

Autres conseils

Haha, eh bien ... On dirait que tu peux. Je me demandais s’il existait un moyen de le faire, s’il en existe.

Lorsque vous utilisez InProc, InProcSessionStateStore (classe interne) conserve l'état de la session dans un cache interne (non public). Vous pouvez accéder à ce cache par réflexion et supprimer l'état de la session manuellement.

using System;
using System.Reflection;
using System.Web;

object obj = typeof(HttpRuntime).GetProperty("CacheInternal", 
    BindingFlags.NonPublic | BindingFlags.Static)
        .GetValue(null, null);

if (obj != null)
{
    MethodInfo remove = obj.GetType()
        .GetMethod("Remove", BindingFlags.NonPublic | BindingFlags.Instance, 
            Type.DefaultBinder, new Type[] { typeof(string) }, null);

    object proc = remove.Invoke(obj, new object[] { "j" + state.SessionID });
}

Le résultat final est que la prochaine demande prendra le même SessionID, mais que le HttpSessionState sera vide. Vous obtiendrez toujours les événements Session_Start et Session_End.

Avec InProc SessionState, vous ne pourrez pas accéder aux données ... Avec StateServer, vous aurez toujours un scénario difficile à résoudre qui tente d'accéder à la bonne API pour supprimer la session.

Vous souhaiterez probablement utiliser une solution d'état sauvegardée sur une base de données telle que le fournisseur d'état SqlServer préemballé ou une solution tierce telle que DOTSS: http://codeplex.com/dotss

Avec la solution sauvegardée par base de données, vous pourrez rechercher l'enregistrement d'état dans une table par identifiant de session et le marquer comme terminé. Ces techniques varient en fonction du fournisseur que vous choisissez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top