Почему файлы cookie не распознаются при нажатии на ссылку из внешнего источника (например, Excel, Word и т. Д.) - PullRequest
56 голосов
/ 16 апреля 2010

Я заметил, что при внешнем нажатии на ссылку из веб-браузера, например из Excel или Word, мой файл cookie сеанса изначально не распознается, даже если ссылка открывается на новой вкладке того же окна браузера.

Браузер в конце концов распознает свои cookie, но я озадачен тем, почему эта исходная ссылка из Excel или Word не работает. Чтобы сделать его еще более сложным, щелкнув ссылку, можно работать в Outlook.

Кто-нибудь знает, почему это может происходить? Я использую Zend Framework с PHP 5.3.

Ответы [ 16 ]

0 голосов
/ 11 апреля 2019

Вот пример исправления с использованием промежуточного программного обеспечения ядра dotnet:

public class MicrosoftOfficeLinksHandlingMiddleware
{
    private static readonly Regex MsUserAgentsRegex = new Regex(@"[^\w](Word|Excel|PowerPoint|ms-office)([^\w]|\z)");
    private readonly RequestDelegate _next;

    public MicrosoftOfficeLinksHandlingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        string userAgent = context.Request.Headers["User-Agent"].FirstOrDefault();

        if (userAgent != null && MsUserAgentsRegex.IsMatch(userAgent))
        {
            // just return an empty response to the office agent
            return;
        }

        await _next(context);
    }
}
0 голосов
/ 24 августа 2018

Вот как обойти это с Java и Spring через фильтр:

/**
 * 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<MicrosoftFilter> registrationBean = new FilterRegistrationBean<>();
    registrationBean.setFilter(new MicrosoftFilter());
    registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
    return registrationBean;
  }
}
0 голосов
/ 08 июня 2018

Не могу поверить, что они называют это функцией.Однако вот исправление для 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]

Может показаться не лучшим с точки зрения производительности, так как вся страница отправляется вместо пустого ответа, но я не хотел добавлять другие модули Apache просто для исправления таких проблем.идио ^ H ^ H ^ H ^ H особенность.

0 голосов
/ 03 ноября 2015

Используйте исправления, предоставленные Microsoft по приведенной ниже ссылке. https://support.microsoft.com/en-us/kb/218153

0 голосов
/ 28 октября 2015

Мне пришлось решить эту проблему для сайта ASP.NET, но я хотел использовать только 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;
}

Я получил функцию gup от: Как получить значение из параметра URL?

0 голосов
/ 18 апреля 2010

Я подозреваю, что это связано с тем, как вы устанавливаете куки.

Из-за особенностей создания веб-сайта example.com не считается тем же доменом, что и www.example.com; следовательно: вы можете войти в систему на www.example.com и не войти на example.com.

То есть, другими словами, проверьте URL в вашем файле word или excel - это тот же домен, что и вошли в браузер?

Существует два исправления / решения этой несоответствия cookie: 1. Перенаправить любого, кто пытается загрузить ваш сайт без www. на той же странице с www. (или наоборот), или 2. когда вы устанавливаете куки, убедитесь, что в качестве аргумента домена указано «.example.com». Первая точка указывает, что cookie должен быть действителен также во всех поддоменах этого домена.

Я подозреваю, что причина, по которой браузер в конечном итоге распознает это, заключается в том, что вы, вероятно, в конечном итоге окажетесь в URL с той же структурой домена, что и вошли в систему.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...