2011-08-24 16 views
5

Tenemos un requisito en el que nos gustaría redirigir al usuario a una página de inicio de sesión cuando expira la sesión de ASP.NET y el usuario está trabajando en un complemento de Silverlight.Tiempos de espera de sesión de Silverlight, RIA y ASP.Net

Por lo tanto, el escenario es que tenemos una aplicación heredada que ejecuta ASP.Net, todos nuestros nuevos módulos están en Silverlight, y la aplicación heredada carga la aplicación Silverlight. Todo funciona :-) El usuario se retira de su escritorio y regresa después de que la sesión ASP.Net termina, pero luego intenta continuar haciendo algo en la aplicación Silverlight, que usa un servicio de dominio RIA. Como la sesión tiene tiempo de espera, el servicio de dominio RIA falla, pero no falla con una excepción de SessionExpired, ni con un usuario/contraseña no válida, simplemente falla con una excepción de dominio que es similar a las excepciones "reales" lanzadas en el dominio modelo, por lo que no tenemos forma de identificar que esta vez fue porque la sesión expiró.

Hay muchas respuestas sobre cómo mantener viva su sesión ASP.Net, no queremos hacer eso, queremos que la sesión expire, pero queremos poder manejarla con elegancia en Silverlight y dirigir al usuario a la página de inicio de sesión.

Tenemos esto funcionando, pero el problema es siempre que se produce una excepción en la aplicación de Silverlight, esto lo redirige a la página de inicio de sesión, que no es el comportamiento previsto. Solo queremos redireccionar cuando se trata de un caso de caducidad de la sesión.

¿Alguna idea?

Respuesta

2

Me pasó a tener el mismo problema. He añadido el código siguiente a la Application_UnhandledException:

private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) 
{ 
    // redirect to login on exceptions when user is not logged in 
    var domainException = e.ExceptionObject as DomainOperationException; 
    if (domainException != null && !WebContext.Current.User.IsAuthenticated) 
    { // probably a server-side timeout has occurred. 
     e.Handled = true; 
     HtmlPage.Document.Submit(); // redirect to login page 
    } 
} 

Siempre que hay una excepción dominio y el usuario no se registra en (I asumir que el usuario tiene que estar conectado para ver cualquier página), vuelvo a dirigir a la llamando a la página que hace que ASP.NET redirija a la página de inicio de sesión.

EDITAR: Esta solución es útil cuando utiliza un formulario de inicio de sesión .aspx (que normalmente utilizo para evitar que un usuario no autenticado descargue el código de Silverlight). En caso de que utilice un formulario de registro de Silverlight, encontrará su respuesta aquí https://stackoverflow.com/a/8083744/178620.

+0

Debería abrir la ventana RegistrationWindow, en lugar de tratar de volver a cargar HtmlPage. Esta es una respuesta mucho mejor: http://stackoverflow.com/a/8083744/178620 –

+0

Muchas gracias por su consejo. Tiene razón si usa una ventana de inicio de sesión/registro de Silverlight. Prefiero usar la autenticación de formularios asp.net y un formulario web HTML para el inicio de sesión, porque un usuario malintencionado no puede descargar la aplicación Silverlight sin iniciar sesión. En estas circunstancias, mi respuesta sigue siendo la correcta y prefiero su solución. – slfan

+0

Veo de dónde vienes ahora: la pregunta especifica RIA y la mayoría de las personas simplemente usarán RegistrationWindow. Si no le importa actualizar su respuesta con su perspectiva, podré quitarle el voto negativo. –

Cuestiones relacionadas