J’ai remarqué que lorsque l’on clique sur un lien externe depuis le navigateur Web, par exemple depuis Excel ou Word, mon cookie de session est initialement non reconnu, même si le lien s’ouvre dans un nouvel onglet de la même fenêtre de navigateur.
Le navigateur finit par reconnaître son cookie, mais je ne comprends pas pourquoi ce lien initial d’Excel ou de Word ne fonctionne pas. Pour le rendre encore plus difficile, cliquer sur un lien fonctionne bien avec Outlook.
Est-ce que quelqu’un sait pourquoi cela pourrait arriver? J’utilise le framework Zend avec PHP 5.3.
Cela est dû au fait que MS Office utilise le composant Hlink.dll pour rechercher si le lien est un document Office ou autre chose. MS Office espère ouvrir le document lié dans les documents sans l’aide d’un navigateur externe (en utilisant le composant Hlink.dll d’IE6).
Si le cookie de session protège le site Web, Hlink est naturellement redirigé vers la page de connexion et a atteint la page HTML et ne peut pas “comprendre” qu’il l’ouvre dans un navigateur externe. Notez qu’il ouvre pas l’URL d’origine (comportement attendu) mais le résultat de la redirection, même s’il s’agissait d’une redirection 302.
Microsoft a ce bogue dans le composant non pris en charge (Hlink.dll), au lieu de reconnaître le bogue, il le remet en tête (en essayant de nous convaincre qu’il s’agit d’un système SSO utilisé, par exemple les cookies de session) et refuse de le mettre à jour. Il offre une solution de contournement qui désactive la fonctionnalité de recherche de MS Office:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ Office\9.0\Common\Internet\ForceShellExecute:DWORD=1
Ou proposez-nous des serveurs de contournement, pour éviter les redirections HTTP et passer en redirections Javascript ou en redirections META REFRESH (par exemple, pour que Hlink obtienne une page text / html sur l’URL d’origine et l’exécute avec un navigateur externe).
Nous avons eu le même problème et écrit un joyau open source pour aider ceux qui utilisent des rails: https://github.com/spilliton/fix_microsoft_links
Vous pouvez utiliser la même approche que nous avons utilisée sur n’importe quel framework:
Exemple de code ici: https://github.com/spilliton/fix_microsoft_links/blob/master/lib/fix_microsoft_links.rb
Côté serveur, cela a fonctionné pour moi dans IIS (en utilisant une règle de réécriture)
Correction pour VB.NET:
Dim userAgent As Ssortingng = 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("") System.Web.HttpContext.Current.Response.End() End If
Il oblige fondamentalement le navigateur à actualiser la page, de sorte que la requête arrive avec l’agent utilisateur du navigateur et tous les cookies corrects.
Voici une solution pour C # ASP.NET basée sur la réponse de spilliton ci-dessus. Dans Global.asax.cs, ajoutez ce qui suit:
private static ssortingng 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(""); Response.End(); } }
Solution PHP:
Cela empêche le produit MS de reconnaître la redirection. MS lance donc un navigateur à partir du lien requirejs.
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(); } }
.. redirect après ce code
1.De Excel / Word pointe vers http://example.com/from_excel.php
2.Dans “from_excel.php”, redirige vers la page où vous utilisez la session
Voici ma solution pour cela dans WordPress. Ajoutez ceci à functions.php dans votre thème ou dans un autre fichier de plugin.
Cela peut être utile si votre système, comme WP, envoie des utilisateurs déconnectés à une page de connexion avec une redirection vers la page à laquelle ils tentent d’accéder. Word envoyait les utilisateurs à cette page, mais WP ne gérait pas correctement le cas où un utilisateur était déjà connecté. Ce code vérifie s’il y a un utilisateur actuel et un paramètre redirect_to passé. Si c’est le cas, il redirige vers l’emplacement 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');
Voici un correctif VBA pour Excel. Le même concept peut être appliqué pour Microsoft Word. Fondamentalement, plutôt que de déclencher le lien depuis Excel, le code exécute le lien depuis un shell. Voici le code:
Private Sub Worksheet_FollowHyperlink(ByVal objLink As Hyperlink) Application.EnableEvents = False Dim strAddress As Ssortingng strAddress = "explorer " & objLink.TextToDisplay Dim dblReturn As Double dblReturn = Shell(strAddress) Application.EnableEvents = True End Sub
Quelques notes:
Je devais résoudre ce problème pour un site ASP.NET mais je voulais seulement utiliser 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; }
J’ai la fonction gup de: Comment obtenir la valeur du paramètre URL?
Utilisez le correctif fourni par Microsoft à partir du lien ci-dessous. https://support.microsoft.com/en-us/kb/218153
Je ne peux pas croire qu’ils appellent cela une fonctionnalité. Cependant, voici un correctif pour 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]
Peut-être ne serait-ce pas la meilleure performance, car la page entière est envoyée au lieu d’une réponse vide, mais je ne voulais pas append d’autres modules Apache juste pour corriger une telle fonctionnalité ^ H ^ H ^ H ^ H.
Voici comment résoudre ce problème avec Java et Spring via un filtre:
/** * To see why this is necessary, check out this page: * https://support.microsoft.com/en-gb/help/899927. */ public class MicrosoftFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response, final FilterChain filterChain) throws ServletException, IOException { //Serve up a blank page to anything with a Microsoft Office user agent, forcing it to open the //URL in a browser instead of trying to pre-fetch it, getting redirected to SSO, and losing //the path of the original link. if (!request.getHeader("User-Agent").contains("ms-office")) { filterChain.doFilter(request, response); } } } /** * Security configuration. */ @Configuration public class SecurityConfiguration { @Bean public FilterRegistrationBean microsoftFilterRegistrationBean() { FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new MicrosoftFilter()); registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); return registrationBean; } }
Je pense que cela dépend de la manière dont vous configurez le ou les cookies.
En raison de la nature de la création du site Web, example.com n’est pas considéré comme le même domaine que www.example.com
; par conséquent: vous pouvez être connecté sur www.example.com
et ne pas être connecté sur example.com
.
En d’autres termes, vérifiez l’URL dans votre fichier Word ou Excel. S’agit-il du même domaine que celui dans lequel vous êtes connecté dans votre navigateur?
Il existe deux solutions / solutions à cette incohérence des cookies: 1. redirigez toute personne essayant de charger votre site sans www. à la même page avec le www. (ou vice versa), ou 2. lorsque vous définissez le cookie, assurez-vous de spécifier l’argument de domaine sous le nom “.exemple.com”. Le point en tête indique que le cookie doit également être valide sur tous les sous-domaines de ce domaine.
Je soupçonne que la raison pour laquelle le navigateur a fini par le reconnaître est que vous finirez probablement par atterrir sur une URL ayant la même structure de domaine que vous êtes connecté.
J’espère que cela t’aides.