В IIS Express использование модуля Saml2AuthenticationModule (из расширения WIF для протокола SAML2 ) приводит к следующему потоку приложений:
- Пользователь переходит на URL-адрес поставщика услуг, который вызывает
Saml2AuthenticationModule.Current.SignIn
(args);
- Модуль направляет запрос поставщику удостоверений.
- В зависимости от метаданных SP AssertionConsumerService IdP отправляет ответ SSO обратно SP. В моих текущих тестах этот URL-адрес "{rootdomain} /
ServiceProvider/saml/post/ac
". Насколько я могу судить, этот URL не настраивается.
- Модуль перехватывает этот ответ, выполняет настройку IClaimsIdentity, а затем перенаправляет поток обратно в приложение SP (аргумент передан на шаге 1).
При нацеливании на эмулятор Windows Azure вместо IIS Express я изменил файл web.config, чтобы он указывал на другой файл метаданных SP с другим AssertionConsumerService, который соответствует URL-адресу эмулятора:
<md:AssertionConsumerService index="1"
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Location="https://127.0.0.1/ServiceProvider/saml/post/ac" />
При отладке в эмуляторе вычисления Azure поток останавливается после шага № 3. Когда он достигает шага № 4, я в итоге просматриваю страницу 404 для этого URL:
https://127.0.0.1/ServiceProvider/saml/post/ac
Что здесь происходит? Разве модуль не должен перехватывать этот URL и обрабатывать ответ SAML? Почему это работает в IIS Express, а не в эмуляторе вычислений Azure?
Вот web.config для SAML:
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
<add name="Saml2AuthenticationModule"
type="Microsoft.IdentityModel.Web.Saml2AuthenticationModule"/>
<add name="SessionAuthenticationModule"
type="Microsoft.IdentityModel.Web.SessionAuthenticationModule"/>
</modules>
...
</system.webServer>
...
<microsoft.identityModel>
<service>
<audienceUris>
<add value="https://www.mydomain.com/saml2/development/azure"/>
</audienceUris>
<certificateValidation certificateValidationMode="None"/>
<issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry">
<!-- The set of trusted issuers. -->
<trustedIssuers>
<add name="urn:samples:identityprovider" thumbprint="59 fc 9a da 58 86 31 8d 1d d5 f8 a6 0f 9a 53 f8 09 fc 0e 63"/>
</trustedIssuers>
</issuerNameRegistry>
<serviceTokenResolver type="Samples.Saml.Utilities.SampleServiceProviderSecurityTokenResolver"/>
<!-- Enable saveBootstrapTokens so the token visualizer can show the raw SAML assertion. -->
<securityTokenHandlers>
<securityTokenHandlerConfiguration saveBootstrapTokens="true">
</securityTokenHandlerConfiguration>
</securityTokenHandlers>
<federatedAuthentication>
<cookieHandler requireSsl="true"/>
</federatedAuthentication>
</service>
</microsoft.identityModel>
...
<microsoft.identityModel.saml metadata="saml2-azure.xml">
<identityProviders>
<metadata file="identityprovider.xml"/>
</identityProviders>
</microsoft.identityModel.saml>
EntityID в saml2-azure имеет значение https://www.mydomain.com/saml2/development/azure
, имеет указанный выше URL-адрес AssertionConsumerService и находится в тестируемом SP и IdP.