Posso abandonar uma sessão InProc ASP.NET a partir de uma diferente sessão de um fazer o pedido?

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

Pergunta

Nós temos um aplicativo que faz single sign-on usando um servidor de autenticação centralizado (CAS). Nós gostaríamos de fazer single sign-out, de modo que se o usuário fizer fora de um aplicativo (dizer um portal front-end), o usuário é automaticamente desconectado de todas as aplicações usando o mesmo sign-on único bilhete.

A expectativa seria que cada aplicação iria registrar um gancho de sinal-out (URL) com o CAS no momento do logon para essa aplicação. Quando o CAS recebe o sinal a pedido de um dos aplicativos, ele chama o gancho sinal-para toda a aplicação compartilhar o ticket SSO.

A minha pergunta é esta: existe uma maneira de abandonar uma sessão InProc de uma sessão diferente? Eu presumo que, desde a solicitação HTTP será proveniente do servidor CAS, que terá sua própria sessão, mas é a sessão do usuário que eu quero terminar. Eu tenho boa idéia de como fazer isso usando um servidor de estado de sessão separada, mas eu gostaria de saber se é possível usar o estado da sessão InProc.

Foi útil?

Solução 2

Depois de fazer um pouco de cavar em volta e considerando as respostas dadas até agora eu vim acima com uma alternativa que me permite continuar a usar sessão InProc. Basicamente, consiste em estender o HttpModule que já lida com single sign-on para detectadas sinal saídas CAS e redirecionar o browser para o sinal aplicativo fora página.

Outline:

Sign-On:

  1. Para cada novo single sign-on pedido, criar um novo cookie SSO e codificar um valor único nele para identificar a sessão (não o ID de sessão, por isso não é vazado).
  2. Construir o sinal-out callback url, codificados com o identificador, e registrá-lo com o servidor CAS.

Sign-Out:

  1. Quando um pedido sinal-out é recebida a partir do servidor CAS, decodificar o identificador e armazená-lo em um cache de toda a aplicação. Isso precisa ser fixado no cache pelo menos o suficiente por muito tempo para a sessão expire naturalmente.
  2. Para cada pedido, olhar para o cookie SSO e verificar o seu valor em relação ao cache, assinou-out identificadores de sessão. Se houver um hit, remover o cookie SSO e redirecionar o navegador para url sinal-out da aplicação.
  3. Para cada sinal-out, verificar para ver se há um cookie de SSO, se assim for, encaminhar a solicitação de inscrição para o CAS. Em qualquer caso, abandonar a sessão do usuário, e assiná-las para fora do aplicativo.

Page_Load:

  1. Verifique se há a presença do cookie SSO. Se não houver um, redirecionamento para o sinal a página.

Outras dicas

Haha, bem ... Parece que você pode. Fiquei me perguntando-me se havia alguma maneira de fazer isso, acaba, não existe.

Quando você usa InProc, o InProcSessionStateStore (classe interna) persistir o estado da sessão em um cache interno (não pública). Você pode acessar esse cache através da reflexão e remover o estado de sessão manualmente.

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 });
}

O resultado final é que o próximo pedido assumirá o mesmo SessionID, mas o HttpSessionState estará vazia. Você ainda vai receber os eventos Session_Start e Session_End.

Com InProc SessionState, você não será capaz de acessar os dados ... Com StateServer, você ainda terá um cenário pegajoso tentando acessar a API correta para remover a sessão.

Você provavelmente irá querer usar um banco de dados apoiado solução do estado como o provedor de estado SqlServer pré-embalados ou uma solução de terceiros, como DOTSS: http://codeplex.com/dotss

Com o banco de dados solução apoiada, você será capaz de procurar o registro do estado em uma tabela ID de sessão e marcá-la como concluída. Estas técnicas vão variar de acordo com o provedor que você escolher.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top