Цикл перенаправления OWA на owa/auth/errorFE.aspx? HttpCode=404 с включенным SSO SAML
Мы пытаемся установить тестовую среду для Exchange 2013 15.0 (сборка 1104.5) с нашим продуктом. Мы наткнулись на эти ссылки, которые помогли нам настроить единый вход с Exchange (owa и ecp):
http://owaauth.com/identity-federation-for-owa-2010-sp1sp2-part-2-of-4/
http://www.theidentityguy.com/articles/2010/10/15/access-owa-with-adfs.html
После некоторых исследований и разработки мы создали рабочий PoC со следующим пользовательским опытом:
GET https://mydomain/owa
-> Перенаправить на /identityprovider/sso?[AuthParams]
Здесь мы аутентифицируем пользователя на нашей платформе, а затем отправляем запрос с подтверждением SAML1.1.
POST https://mydomain/owa
-> Получить в OWA или ECP
Здесь все работает отлично, пользователь может отправлять почту, проверять календарь и т. Д. OWA работает как положено.
Однако мы идем некоторые проблемы:
Странное поведение с ошибками. Если у пользователя нет почтового ящика, наш сервер Exchange выдает HTTP 500 Microsoft.Exchange.Data.Storage.UserHasNoMailboxException
ошибка. Затем пользователь перенаправляется на GET /owa/auth/errorfe.aspx?httpError=500
со всеми данными для печати приятная ошибка. Я могу найти ошибку на EventViewer.
НО
Похоже, что сервер не находит /owa/auth/errorFE.aspx, поэтому он выдает 404, что переводит в перенаправление 302 на.... /owa/auth/errorfe.aspx?httpError=404
, И тогда это зацикливается.
Вот журналы c:/inetpub/log/LogFiles/W3SCV1, которые показывают этот сценарий:
2015-08-18 14:05:32 192.168.122.169 POST /owa/ &CorrelationID=<empty>;&ClientId=RZHCSKVBKKYBNFDWXLYQ&cafeReqId=7a87be7e-8604-4166-9700-2c09f396962d; 443 domain\user 192.168.122.1 Mozilla/5.0+(X11;+Ubuntu;+Linux+x86_64;+rv:38.0)+Gecko/20100101+Firefox/38.0 https://identityprovider/sso?wa=wsignin1.0&wtrealm=https://mail.domain.fr/owa/&wctx=rm=0&id=passive&ru=/owa/?bO=1&wct=2015-08-18T14:05:11Z&wreply=https://mail.domain.fr/owa/ 302 0 0 265
2015-08-18 14:05:36 192.168.122.169 GET /owa/ bO=1&CorrelationID=<empty>;&ClientId=RZHCSKVBKKYBNFDWXLYQ&cafeReqId=ce366ef2-c53b-4c69-a9d5-a6571898ee0a; 443 domain\user 192.168.122.1 Mozilla/5.0+(X11;+Ubuntu;+Linux+x86_64;+rv:38.0)+Gecko/20100101+Firefox/38.0 https://identityprovider/sso?wa=wsignin1.0&wtrealm=https://mail.domain.fr/owa/&wctx=rm=0&id=passive&ru=/owa/?bO=1&wct=2015-08-18T14:05:11Z&wreply=https://mail.domain.fr/owa/ 302 0 0 3765
2015-08-18 14:05:36 192.168.122.169 GET /owa/auth/errorfe.aspx httpCode=500&msg=3529056431&msgParam=domain\user&owaError=Microsoft.Exchange.Data.Storage.UserHasNoMailboxException&owaVer=15.0.1104.5&be=EXCHANGE&ts=130843803365507555&CorrelationID=<empty>;&ClientId=RZHCSKVBKKYBNFDWXLYQ&cafeReqId=691c4002-39f0-407b-ad93-5477e8fa49d4; 443 domain\user 192.168.122.1 Mozilla/5.0+(X11;+Ubuntu;+Linux+x86_64;+rv:38.0)+Gecko/20100101+Firefox/38.0 https://identityprovider/sso?wa=wsignin1.0&wtrealm=https://mail.domain.fr/owa/&wctx=rm=0&id=passive&ru=/owa/?bO=1&wct=2015-08-18T14:05:11Z&wreply=https://mail.domain.fr/owa/ 302 0 0 124
2015-08-18 14:05:36 192.168.122.169 GET /owa/auth/errorFE.aspx httpCode=404&CorrelationID=<empty>;&ClientId=RZHCSKVBKKYBNFDWXLYQ&cafeReqId=51dd01dd-3008-41ac-b07b-a24acf147c3c; 443 domain\user 192.168.122.1 Mozilla/5.0+(X11;+Ubuntu;+Linux+x86_64;+rv:38.0)+Gecko/20100101+Firefox/38.0 https://identityprovider/sso?wa=wsignin1.0&wtrealm=https://mail.domain.fr/owa/&wctx=rm=0&id=passive&ru=/owa/?bO=1&wct=2015-08-18T14:05:11Z&wreply=https://mail.domain.fr/owa/ 302 0 0 29
2015-08-18 14:05:36 192.168.122.169 GET /owa/auth/errorFE.aspx httpCode=404&CorrelationID=<empty>;&ClientId=RZHCSKVBKKYBNFDWXLYQ&cafeReqId=d9531fd2-2bc9-455c-8d05-5c646c863821; 443 domain\user 192.168.122.1 Mozilla/5.0+(X11;+Ubuntu;+Linux+x86_64;+rv:38.0)+Gecko/20100101+Firefox/38.0 https://identityprovider/sso?wa=wsignin1.0&wtrealm=https://mail.domain.fr/owa/&wctx=rm=0&id=passive&ru=/owa/?bO=1&wct=2015-08-18T14:05:11Z&wreply=https://mail.domain.fr/owa/ 302 0 0 31
Я подозреваю, что это поведение связано с конфигурацией единого входа, которая включает пассивное перенаправление на нашу платформу для аутентификации, но я не совсем уверен. Вот Exchange/v15/FrontEnd/HttpProxy/owa/web.config, которые определяют настройки федерации owa.
<configuration>
<configSections>
<section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</configSections>
<location inheritInChildApplications="false">
<system.web>
<customErrors mode="Off"/>
</system.web>
<!-- Added by Us -->
<system.identityModel>
<identityConfiguration>
<securityTokenHandlers>
<remove type="System.IdentityModel.Tokens.SamlSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<remove type="System.IdentityModel.Tokens.Saml2SecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<add type="System.IdentityModel.Tokens.SamlSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<samlSecurityTokenRequirement mapToWindows="true"/>
</add>
<add type="System.IdentityModel.Tokens.Saml2SecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<samlSecurityTokenRequirement mapToWindows="true"/>
</add>
<remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
<add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</securityTokenHandlers>
<applicationService>
<claimTypeRequired>
<claimType type="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn" optional="false"/>
</claimTypeRequired>
</applicationService>
<audienceUris>
<add value="domain.com"/>
</audienceUris>
<issuerNameRegistry type="System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<trustedIssuers>
<add thumbprint="fffffffffff" name="https://idp.com/"/>
</trustedIssuers>
</issuerNameRegistry>
</identityConfiguration>
</system.identityModel>
<system.identityModel.services>
<federationConfiguration>
<cookieHandler requireSsl="true" path="/"/>
<wsFederation passiveRedirectEnabled="true" issuer="https://idp.com/sso" realm="https://domain.com/owa/" reply="https://domain.com/owa/" requireHttps="true"/>
</federationConfiguration>
</system.identityModel.services>
<!-- /Added by Us -->
<system.webServer>
<serverRuntime uploadReadAheadSize="0"/>
<!-- Added by Us -->
<modules runAllManagedModulesForAllRequests="true">
<add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition=""/>
<add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition=""/>
<!-- /Added by Us -->
<remove name="ServiceModel"/>
<remove name="ServiceModel-4.0"/>
<remove name="Session"/>
<remove name="Profile"/>
<add name="HostHeaderValidationModule" type="Microsoft.Exchange.HttpUtilities.HostHeaderValidationModule, Microsoft.Exchange.HttpUtilities, Version=15.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add name="HttpProxy" type="Microsoft.Exchange.HttpProxy.FbaModule,Microsoft.Exchange.FrontEndHttpProxy,Version=15.0.0.0,Culture=neutral,PublicKeyToken=31bf3856ad364e35" preCondition=""/>
<add name="cafe_exppw"/>
</modules>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="35000000"/>
</requestFiltering>
</security>
<httpProtocol>
<customHeaders>
<add name="X-FEServer" value="EXCHANGE"/>
</customHeaders>
</httpProtocol>
</system.webServer>
<system.web>
<machineKey decryptionKey="AAAAAA" validationKey="BBBBBBB"/>
<compilation defaultLanguage="c#" debug="false">
<assemblies>
<!-- Added by Us -->
<add assembly="System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<!-- Added by Us -->
<add assembly="Microsoft.Exchange.Clients.Strings, Version=15.0.0.0, Culture=neutral, publicKeyToken=31bf3856ad364e35"/>
<add assembly="Microsoft.Exchange.Data.Directory, Version=15.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="Microsoft.Exchange.Clients.Common, Version=15.0.0.0,Culture=neutral, publicKeyToken=31bf3856ad364e35"/>
<add assembly="Microsoft.Exchange.Clients.Security, Version=15.0.0.0, Culture=neutral, publicKeyToken=31bf3856ad364e35"/>
<add assembly="Microsoft.Exchange.FrontEndHttpProxy, Version=15.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="Microsoft.Exchange.HttpProxy.Common, Version=15.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add assembly="Microsoft.Exchange.Security, Version=15.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</assemblies>
</compilation>
<httpRuntime maxUrlLength="500" maxRequestLength="35000" requestValidationMode="2.0" requestValidationType="Microsoft.Exchange.Security.Authentication.AdfsRequestValidator"/>
<pages validateRequest="false"/>
</system.web>
</location>
<appSettings>
<add key="HttpProxy.ProtocolType" value="Owa"/>
<add key="OAuthHttpModule.Profiles" value="S2SAppActAs|Callback|V1AppActAs|V1Callback"/>
<add key="OAuthHttpModule.V1AppScopes" value="user_impersonation"/>
<add key="OAuthHttpModule.WebAppAuthEnabled" value="15.00.1030.000"/>
<!--
<add key="LogonSettings.SignOutKind" value="LegacyLogOff" />
-->
</appSettings>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding name="SecureBinding" maxConnections="100000">
<security mode="Transport">
<transport protectionLevel="EncryptAndSign"/>
</security>
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="net.tcp://localhost:1009/Microsoft.Exchange.Security.Authentication.FederatedAuthService" binding="netTcpBinding" bindingConfiguration="SecureBinding" contract="Microsoft.Exchange.Security.Authentication.FederatedAuthService.IAuthService" name="Microsoft.Exchange.Security.Authentication.FederatedAuthService"/>
</client>
</system.serviceModel>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<linkedConfiguration href="file://C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\SharedWebConfig.config"/>
</assemblyBinding>
</configuration>
Последний бит:
Если у пользователя почтовый ящик не настроен (без часового пояса и языка), пользователь попадает на languageselection.aspx, выбирает правильный параметр, а затем сервер выдает 500 внутренних ошибок, которые не перенаправляются. Я не могу найти ошибку на EventViewer об этой ошибке. Есть идеи почему?
Если у вас есть какие-либо вопросы, продолжайте. Будь то конфигурационные файлы, настройки на IIS или Exchange. Все, что вам кажется относящимся к этой проблеме.