Del caso MSFT # 111101555217932
Verá esta funcionalidad con cualquier página web que acepte datos dentro de una solicitud HTTP POST. La lógica de Azure ACS es que el proceso de envío de datos de formularios a través de una POST de HTTP en realidad se muestra como una entrada en el historial de su navegador. Si verifica el historial inmediato de su navegador, la entrada aparecerá como "Trabajando ..." en la lista. Esto le permite "navegar" de regreso a esta entrada. Una vez que intente navegar de nuevo a esta 'página', el navegador notificará que el contenido ya ha caducado, por lo que le indicará con información que el contenido ha caducado y le preguntará si desea volver a enviar la solicitud para obtener la versión 'actualizada' de Esa página desde el servidor. Una vez que hace clic en el botón Reintentar, los datos de estos formularios se devuelven a ADFS y ADFS los trata como una solicitud de inicio de sesión normal, de modo que autentica esa solicitud y envía el token SAML y lo redirige automáticamente a su página web original.
Verás este mismo comportamiento con otros navegadores también.
Entonces, queremos saber cómo evitar que los usuarios inicien sesión como otro usuario simplemente pulsando de nuevo, de nuevo, de nuevo, de actualización. Tuve algunas conversaciones con nuestro equipo de IE y nuestro equipo de ASP.NET y se nos ocurrió un par de cosas que podrías intentar para evitar este problema.
Soluciones del lado del cliente
-
Una sugerencia de nuestro equipo de IE es modificar la página de inicio de sesión de ADFS para que no acepte las credenciales de inicio de sesión directamente. En su lugar, solo contiene un botón que dice inicio de sesión. Cuando el usuario haga clic en este botón de inicio de sesión, tendrá un javascript que ejecuta la llamada a window.open () para iniciar un segundo cuadro de diálogo pequeño que navega a una segunda página alojada en su sitio web de ADFS. La segunda página de ADFS aceptará el nombre de usuario y la contraseña y luego los enviará para la autenticación. Después de que el cuadro de diálogo inicie sesión, puede cerrar esa ventana y usar la ventana principal para navegar a la aplicación de su usuario de confianza.
-
Otra sugerencia es probar una llamada a location.replace () como se describe aquí: enlace Esto eliminaría una entrada de la lista de historial a medida que navega a una página nueva.
Soluciones laterales del servidor
-
Una opción es modificar la página de inicio de sesión de ADFS para que el usuario también envíe un valor basado en el tiempo como parte de los datos del formulario. Digamos que agregó un valor TimeSubmitted al formulario y cuando el usuario hizo clic en el botón de inicio de sesión, tiene un script que establece el valor a la hora actual y lo envía como parte de los datos de inicio de sesión. Luego, en el lado del servidor, verificará este valor y si fue más de 2 a 5 segundos más tarde que la hora actual del servidor, podría rechazar el intento de inicio de sesión y enviar al cliente una nueva página de inicio de sesión para ingresar manualmente combinación de nombre de usuario / contraseña de nuevo.
-
Otra sugerencia del lado del servidor es manipular el historial del navegador para eliminar esa entrada "Trabajando ...". Para hacer esto, puede emitir un script del lado del cliente dentro del evento PreRender de las páginas. Así que en tu página de inicio de sesión podrías tener
private void WebForm1_PreRender(object sender, System.EventArgs e)
{
if (IsPostBack)
{
Response.Write("<html><head><script>location.replace('"+Request.Path+"');\n"
+"</script></head><body></body></html>\n");
Response.End();
}
La solicitud POST se elimina del historial de navegación de IE. El historial contendrá solo las solicitudes GET.
- También puede ocultar la barra de navegación del navegador en su quiosco y simplemente agregar los botones de avance y retroceso a sus páginas directamente. Tendría que manejar las funciones de navegación de la página con sus propias páginas y, obviamente, no permitir que un usuario navegue "Atrás" desde la página de inicio de sesión de ADFS.
Lamentablemente, no hay una manera fácil de solucionar este problema de deshabilitar la capacidad de alguien para volver a enviar los datos del formulario, incluso si los datos del formulario se utilizan para autenticar e iniciar sesión en un usuario. De todas las sugerencias propuestas, probablemente implementaría la primera solución del lado del servidor en la que simplemente pasa el tiempo enviado y si está a una cierta delta de la hora del servidor, simplemente ignore la solicitud porque es una nueva publicación de un intento de inicio de sesión exitoso anterior.