Автообнаружение Outlook с перенаправлением HTTP не работает - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь настроить службу автообнаружения с помощью метода перенаправления HTTP 302, который перенаправляет на домен, который правильно обеспечивает автообнаружение. xml через HTTPS. При такой конфигурации параметры автообнаружения POP / IMAP / SMTP и EAS корректно предоставляются на iPhone и Android, поэтому я считаю, что служба настроена правильно, а полезная нагрузка XML правильная. Кроме того, https://testconnectivity.microsoft.com/ дает положительные результаты как в Outlook Autodiscover ed. Exchange ActiveSyn c Autodiscover.

Проблема возникает только в Outlook для Office 365 и Windows App Mail (включено windows 10). В обоих случаях после заполнения адреса электронной почты в регистрационной форме запрос к автообнаружению проходит нормально (я добавил распечатку сгенерированного XML и это правильно). Однако есть второй экран, где предлагается ввести пароль, и здесь возникает проблема. В основном, новый запрос GET (/AutoDiscover/AutoDiscover.xml) отправляется исходному домену (через HTTP), но перенаправление 302 в этом случае не происходит, и появляется новое окно, сообщающее, что параметры не найдены. Это похоже на второй вызов после ввода пароля, который ожидает ответа, отличного от перенаправления 302.

Чтобы лучше описать мою конфигурацию:

  • адрес электронной почты, для которого я запрашиваю автообнаружение: user@domain1.com
  • конфигурация DNS: autodiscover.domain1.com CNAME для autodiscover.domain2.com
  • autodiscover.domain1.com (IP-адрес autodiscover.domain2.com через CNAME в DNS) отвечает только на ответы через HTTP и выполняет перенаправление 302 на https://autodiscover.domain2.com/AutoDiscover/AutoDiscover.xml (без учета регистра)
  • autodiscover.domain2.com имеет правило Apache, поэтому файл AutoDiscover. xml (без учета регистра) ) генерируется сценарием PHP, который анализирует содержание запроса и отвечает с правильным XML для EAS или Outlook на основе содержимого запроса.

Я также пытался установить запись SRV указывает на autodiscover.domain2.com, но результат тот же.

Я вполне уверен, что полезная нагрузка XML верна, потому что на Android и iPhone EAS настроен как Я настроен нормально, только с Outlook и App Mail мне не удается заставить его работать.

Любая помощь приветствуется!

Это конфигурация виртуального хоста:

<VirtualHost *:80>
    ServerName autodiscover.domain2.com
    ServerAlias autodiscover.*
    ServerAlias autoconfig.*
    DocumentRoot /var/www/autodiscover.domain2.com/public_html
    ErrorLog /var/log/autodiscover.domain2.com_error_log
    CustomLog /var/log/autodiscover.domain2.com_access_log combined
</VirtualHost>

<VirtualHost *:443>
    ServerName atodiscover.domain2.com
    ServerAlias autoconfig.domain2.com
    DocumentRoot /var/www/autodiscover.domain2.com/public_html
    ErrorLog /var/log/autodiscover.domain2.com_error_log
    CustomLog /var/log/autodiscover.domain2.com_access_log combined

    ScriptAlias /AutoDiscover/AutoDiscover.xml /var/www/autodiscover.domain2.com/public_html/outlook.php
    ScriptAlias /Autodiscover/Autodiscover.xml /var/www/autodiscover.domain2.com/public_html/outlook.php
    ScriptAlias /autodiscover/autodiscover.xml /var/www/autodiscover.domain2.com/public_html/outlook.php

    SSLEngine on
    SSLCertificateFile /path/to/ssl.cert
    SSLCertificateKeyFile /path/to/ssl.key
    SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
</VirtualHost>

это .htaccess:

RewriteEngine On

# thunderbird
RewriteRule ^.*config-v1\.1\.xml$ https://autodiscover.domain2.com/thunderbird.php [NC,L]

# redirect autodiscover.xml to https of domain2 (302)
RewriteCond %{HTTPS} off
RewriteRule ^.*autodiscover\.xml$ https://autodiscover.domain2.com%{REQUEST_URI} [NC,L,R=302]

# redirect autodiscover.xml to outlook.php
RewriteCond %{HTTP_HOST} ^autodiscover\.domain2\.com$ [NC]
RewriteRule ^.*autodiscover\.xml$ https://autodiscover.domain2.com/outlook.php [NC,L]

# redirect autodiscover.json to outlook.json.php
RewriteCond %{HTTP_HOST} ^autodiscover\.domain2\.com$ [NC]
RewriteRule ^.*autodiscover\.json$ https://autodiscover.domain2.com/outlook.json.php [NC,L]

это внешний вид. php скрипт помещен в / var / www/html/autodiscover.domain2.com/public_html/:

<?php
header("Content-Type: application/xml");
$data = file_get_contents("php://input");
preg_match("/\<EMailAddress\>(.*?)\<\/EMailAddress\>/", $data, $matches);
if($matches == false || count($matches)!=2) exit(0);
$ar = explode('@' ,$matches[1]);
if(count($ar)!=2) exit(0);
$account = $ar[0];
$domain = $ar[1];
$email = $matches[1];
$provider = 'domain2.com';

$buf = '';

if(preg_match('/mobilesync/',$data))
{
    $buf = '<?xml version="1.0" encoding="utf-8" ?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
  <Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/mobilesync/responseschema/2006">
    <Culture>en:us</Culture>
    <User>
      <DisplayName>'.$email.'</DisplayName>
      <EMailAddress>'.$email.'</EMailAddress>
    </User>
    <Action>
      <Settings>
        <Server>
          <Type>MobileSync</Type>
          <Url>https://eas.domain2.com/Microsoft-Server-ActiveSync</Url>
          <Name>https://eas.domain2.com/Microsoft-Server-ActiveSync</Name>
        </Server>
      </Settings>
    </Action>
  </Response>
</Autodiscover>';
}
else
{
    $buf = '<?xml version="1.0" encoding="utf-8" ?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
 <Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
  <User>
   <DisplayName>'.$email.'</DisplayName>
  </User>
  <Account>
   <AccountType>email</AccountType>
   <Action>settings</Action>
    <Protocol>
     <Type>POP3</Type>
     <Server>pop.'.$provider.'</Server>
     <Port>995</Port>
     <LoginName>'.$email.'</LoginName>
     <DomainRequired>off</DomainRequired>
     <SPA>off</SPA>
     <SSL>on</SSL>
     <AuthRequired>on</AuthRequired>
     <DomainRequired>off</DomainRequired>
    </Protocol>
    <Protocol>
     <Type>IMAP</Type>
     <Server>imap.'.$provider.'</Server>
     <Port>993</Port>
     <DomainRequired>off</DomainRequired>
     <LoginName>'.$email.'</LoginName>
     <SPA>off</SPA>
     <SSL>on</SSL>
     <AuthRequired>on</AuthRequired>
    </Protocol>
    <Protocol>
     <Type>SMTP</Type>
     <Server>smtp.'.$provider.'</Server>
     <Port>465</Port>
     <DomainRequired>off</DomainRequired>
     <LoginName>'.$email.'</LoginName>
     <SPA>off</SPA>
     <Encryption>SSL</Encryption>
     <AuthRequired>on</AuthRequired>
     <UsePOPAuth>off</UsePOPAuth>
     <SMTPLast>off</SMTPLast>
    </Protocol>
   </Account>
 </Response>
</Autodiscover>';
}
echo $buf;

это внешний вид. json. php:

<?php
$url = 'https://eas.domain2.com/Microsoft-Server-ActiveSync';

header('Content-type: application/json');
if (strtolower($_GET['Protocol']) == 'activesync') {
  echo '{"Protocol":"ActiveSync","Url":"' . $url . '"}';
}
elseif (strtolower($_GET['Protocol']) == 'autodiscoverv1') {
  echo '{"Protocol":"AutodiscoverV1","Url":"https://' . $_SERVER['HTTP_HOST'] . '/Autodiscover/Autodiscover.xml"}';
}
else {
  http_response_code(400);
  echo '{"ErrorCode":"InvalidProtocol","ErrorMessage":"The given protocol value \u0027' . $_GET['Protocol'] . '\u0027 is invalid. Supported values are \u0027ActiveSync,AutodiscoverV1\u0027"}';
}
...