authentication cookies ms-office internet-explorer-6

authentication - ¿Por qué no se reconocen las cookies cuando se hace clic en un enlace desde una fuente externa(es decir, Excel, Word, etc.)?



ms-office internet-explorer-6 (13)

1.Desde excel / word point a http://example.com/from_excel.php

2.En "from_excel.php", redirija a la página donde usa la sesión

<script>document.location.href = "http://example.com/page_with_session.php"; </script>

Observé que cuando se hace clic externo en un enlace desde el navegador web, como Excel o Word, mi cookie de sesión no se reconoce inicialmente, incluso si el enlace se abre en una nueva pestaña de la misma ventana del navegador.

El navegador termina reconociendo su cookie con el tiempo, pero estoy confundido de por qué ese enlace inicial de Excel o Word no funciona. Para hacerlo aún más difícil, hacer clic en un enlace funciona bien desde Outlook.

¿Alguien sabe por qué esto podría estar pasando? Estoy usando Zend Framework con PHP 5.3.


Aquí está mi solución para esto en WordPress. Agregue esto a functions.php en su tema u otro archivo de complemento.

Esto puede ser útil si su sistema, como WP, envía usuarios desconectados a una página de inicio de sesión con un redireccionamiento a la página a la que intentaron acceder. Word estaba enviando usuarios a esta página, pero entonces WP no manejaba correctamente el caso en el que un usuario ya había iniciado sesión. Este código verifica si hay un usuario actual y un redirect_to param pasado. Si es así, redirecciona a la ubicación de redirect_to.

function my_logged_in_redirect_to() { global $current_user; if($current_user->ID && $_REQUEST[''redirect_to'']) { wp_redirect($_REQUEST[''redirect_to'']); exit; } } add_action(''wp'', ''my_logged_in_redirect_to'');


Aquí hay una solución de VBA, para Excel. El mismo concepto se puede aplicar para Microsoft Word. Básicamente, en lugar de disparar el enlace desde Excel, el código ejecuta el enlace desde dentro de un shell. Aquí está el código:

Private Sub Worksheet_FollowHyperlink(ByVal objLink As Hyperlink) Application.EnableEvents = False Dim strAddress As String strAddress = "explorer " & objLink.TextToDisplay Dim dblReturn As Double dblReturn = Shell(strAddress) Application.EnableEvents = True End Sub

  1. Para la hoja de Excel que contiene los enlaces, haga clic con el botón derecho en la pestaña de la hoja y haga clic en Ver código . El editor de VBA aparece.
  2. Pegue el código en la ventana y cierre el editor.
  3. Modifique cada enlace en la página para que simplemente apunte a la celda en la que se encuentra. Para hacerlo:
  4. Haga clic con el botón derecho en el enlace y haga clic en Editar hipervínculo . Aparece una ventana Editar hipervínculo.
  5. Haga clic en Colocar en este documento .
  6. Haga clic en el nombre de la hoja.
  7. Para Escriba la referencia de celda , ingrese una referencia de celda (por ejemplo, A4).
  8. Haga clic en Aceptar .

Un par de notas:

  • Deberá guardar la hoja de cálculo como una hoja de cálculo habilitada para macros (.xlsm). Cuando los usuarios abren la hoja de cálculo, se les pedirá que habiliten las macros. Si responden No, los enlaces no funcionarán.
  • Estas instrucciones se basan en Excel 2010. Es de suponer que las versiones posteriores son similares.

Aquí hay una solución para C # ASP.NET basada en la respuesta del spilliton anterior. En Global.asax.cs, agregue lo siguiente:

private static string MSUserAgentsRegex = @"[^/w](Word|Excel|PowerPoint|ms-office)([^/w]|/z)"; protected void Application_OnPostAuthenticateRequest(object sender, EventArgs e) { if (System.Text.RegularExpressions.Regex.IsMatch(Request.UserAgent, MSUserAgentsRegex)) { Response.Write("<html><head><meta http-equiv=''refresh'' content=''0''/></head><body></body></html>"); Response.End(); } }


El lado del servidor esto funcionó para mí en IIS (usando una regla de reescritura)

<rule name="WordBypass" enabled="true" stopProcessing="true"> <match url=".*" /> <conditions> <add input="{HTTP_USER_AGENT}" pattern="Word|Excel|PowerPoint|ms-office" /> </conditions> <action type="CustomResponse" statusCode="200" statusReason="Refresh" statusDescription="Refresh" /> </rule>


Esto se debe a que MS Office está utilizando el componente Hlink.dll para buscar si el enlace es un documento de Office u otra cosa. MS Office espera abrir el documento vinculado dentro de los documentos sin la ayuda de un navegador externo (utilizando el componente Hlink.dll de IE6).

Si la cookie de sesión protege el sitio web, naturalmente Hlink está siendo redireccionado a la página de inicio de sesión y, habiendo alcanzado la página HTML y no puede "entender", lo abre en un navegador externo. Tenga en cuenta que abre URL no original (comportamiento esperado) pero el resultado de la redirección, incluso si fue 302 redirigir.

Microsoft tiene ese error en el componente no soportado (Hlink.dll), en lugar de reconocer el error, se lo pasan a la cabeza (tratando de convencernos de que es una falla del sistema SSO que usamos, es decir, las cookies de sesión) y se niega a actualizarlo. Ofrece una solución que desactiva la funcionalidad de búsqueda de MS Office:

HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/ Office/9.0/Common/Internet/ForceShellExecute:DWORD=1

O bien, ofrezca soluciones alternativas para evitar las redirecciones HTTP y cambiar a redirecciones de Javascript o redireccionamientos META REFRESH (es decir, que Hlink obtenga la página text / html en la URL original y haga que ejecute un navegador externo para manejarla).


No puedo creer que lo llamen una característica. Sin embargo, aquí hay un featurefix para Apache:

RewriteEngine On # Send a 200 to MS Office so it just hands over control to the browser # It does not use existing session cookies and would be redirected to the login page otherwise # https://www.wimpyprogrammer.com/microsoft-office-link-pre-fetching-and-single-sign-on/ RewriteCond %{HTTP_USER_AGENT} ;/sms-office(/)|;) RewriteRule .* - [R=200,L]

Puede que no sea lo mejor en cuanto a rendimiento, ya que se envía toda la página en lugar de una respuesta vacía, pero no quería agregar otros módulos de Apache solo para corregir esa función idio ^ H ^ H ^ H ^ H.


Solución de PHP:

Esto evita que el producto MS reconozca la redirección. MS por lo tanto lanza un navegador desde el enlace requerido.

if (isset($_SERVER[''HTTP_USER_AGENT''])) { $http_user_agent = $_SERVER[''HTTP_USER_AGENT'']; if (preg_match(''/Word|Excel|PowerPoint|ms-office/i'', $http_user_agent)) { // Prevent MS office products detecting the upcoming re-direct .. forces them to launch the browser to this link die(); } }

.. redirigir después de este código


Solución para VB.NET:

Dim userAgent As String = System.Web.HttpContext.Current.Request.UserAgent If userAgent.Contains("Word") Or userAgent.Contains("Excel") Or userAgent.Contains("PowerPoint") Or userAgent.Contains("ms-office") Then System.Web.HttpContext.Current.Response.Clear() System.Web.HttpContext.Current.Response.Write("<html><head><meta http-equiv=''refresh'' content=''0''/></head><body></body></html>") System.Web.HttpContext.Current.Response.End() End If

Básicamente obliga al navegador a actualizar la página, por lo que la solicitud entra con el agente de usuario del navegador y todas las cookies correctas.


Sospecho que esto es una cuestión de cómo estás configurando las cookies.

Debido a la naturaleza de cómo se creó la web, example.com no se ve como el mismo dominio que www.example.com ; por lo tanto: puede iniciar sesión en www.example.com y no iniciar sesión en example.com .

Entonces, en otras palabras, verifique la URL en su archivo de Word o Excel: ¿es el mismo dominio que la forma en que inició sesión en su navegador?

Hay dos soluciones / soluciones para esta incoherencia de cookies: 1. redireccionar a cualquier persona que intente cargar su sitio sin el www. a la misma página con el www. (o viceversa), o 2. cuando está configurando la cookie, asegúrese de especificar el argumento del dominio como ".example.com". El punto inicial indica que la cookie también debe ser válida en todos los subdominios de ese dominio.

Sospecho que la razón por la que el navegador finalmente lo reconoce es porque probablemente termines aterrizando en una URL con la misma estructura de dominio que la forma en que estás conectado.

Espero que esto ayude.


Tuve que resolver este problema para un sitio ASP.NET pero solo quería usar javascript / jQuery:

var isCoBrowse = (''<%= Session["user"].ToString().ToLower() %>'' != ''0''); if (isCoBrowse && window.location.href.indexOf(''ReturnUrl='') >= 0 && window.location.href.indexOf(''dllCheq'') == -1) { //redirect to the ReturnUrl & add dllCheq to the URI var toRedirect = decodeURIComponent(gup(''ReturnUrl'', window.location.href)) + ''&dllCheq''; window.location = toRedirect; }

Obtuve la función gup de: ¿Cómo obtener el valor del parámetro URL?


Tuvimos este mismo problema y escribimos una gema de código abierto para ayudar a aquellos que usan rails: https://github.com/spilliton/fix_microsoft_links

Sin embargo, puede usar el mismo enfoque que usamos en cualquier marco:

  1. Detectar si el agente de usuario es de un producto de Microsoft
  2. Renderice una página html en blanco con una etiqueta meta refresh que hará que el navegador actualice la página con las cookies correctas

Código de ejemplo aquí: https://github.com/spilliton/fix_microsoft_links/blob/master/lib/fix_microsoft_links.rb