События FederatedAuthentication не срабатывают

У меня есть приложения ASP.NET MVC 4 (STS и RP), которые используют WIF 4.5 для аутентификации. Приложение STS имеет настраиваемую службу токенов безопасности, и проверяющая сторона вызывает STS для аутентификации, эта часть работает нормально, но я не хочу использовать cookie для хранения данных своего токена, поэтому я настраиваю события в Global.asax для использования сеанса для хранения данных, но я не могу запустить события FederatedAuthentication, которые выполняли бы эту работу.

В режиме отладки вызывается метод Global.asax Application_Start и регистрируются все нужные мне события, но ни одно из них не вызывается, когда должно быть вызвано. Странно то, что раньше они работали, но вдруг просто перестали стрелять и не знаю почему, так как я ничего не менял. Я настроил метод Application_Error в Global.asax и вообще не получаю ошибок, а также в журналах событий Windows ничего нет.

Что может быть не так в моей конфигурации? Как я могу исследовать проблему?

Web.config

<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>
    <system.web>
        <authorization>
          <deny users="?" />
        </authorization>
        <authentication mode="None"></authentication>
        <httpRuntime targetFramework="4.5" />
        <httpModules>
          <add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
          <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        </httpModules>
    </system.web>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <modules runAllManagedModulesForAllRequests="true">
          <add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
          <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
        </modules>
    </system.webServer>
    <system.identityModel>
        <identityConfiguration>
          <certificateValidation certificateValidationMode="None" />
          <audienceUris>
            <add value="http://www.rp.com/" />
          </audienceUris>
          <issuerNameRegistry type="System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
            <trustedIssuers>
              <add thumbprint="*thumbprint*" name="CertificateName" />
            </trustedIssuers>
          </issuerNameRegistry>
        </identityConfiguration>
    </system.identityModel>
    <system.identityModel.services>
        <federationConfiguration>
          <cookieHandler requireSsl="false" />
          <wsFederation passiveRedirectEnabled="true" issuer="http://www.sts.com/" realm="http://www.rp.com/" reply="http://www.rp.com/" requireHttps="false" />
        </federationConfiguration>
    </system.identityModel.services>
</configuration>

Global.asax

protected void Application_Start(object sender, EventArgs e)
{
    FederatedAuthentication.FederationConfigurationCreated += OnServiceConfigurationCreated;
    FederatedAuthentication.WSFederationAuthenticationModule.SessionSecurityTokenCreated += OnSessionSecurityTokenCreated;
}

private void OnServiceConfigurationCreated(object sender, FederationConfigurationCreatedEventArgs e)
{

}

private void OnSessionSecurityTokenCreated(object sender, SessionSecurityTokenCreatedEventArgs e)
{

}

person desperate man    schedule 22.07.2014    source источник
comment
Хорошо, мне удалось решить часть проблемы, внедрив свой собственный WSFederationAuthenticationModule и зарегистрировав его в файле web.config вместо исходного модуля. Теперь запускается событие OnSessionSecurityTokenCreated. Однако проблема все еще сохраняется, поскольку я не знаю, почему исходный модуль не работает должным образом, но, по крайней мере, у меня есть обходной путь. Большое спасибо парню, который предложил этот совет в этом вопросе: stackoverflow.com/a/14051918/164770   -  person desperate man    schedule 22.07.2014


Ответы (2)


Проблема решена. Это я был виноват.

Я создал общий класс Global.asax в отдельной библиотеке, и все веб-сайты проверяющей стороны ссылались на него (просто для уменьшения дублирования кода). Веб-сайт RP запускается, вызывается его собственный Global.asax Application_Start, а затем вызывается Application_Start базового класса, там регистрируются события.

public class GlobalHttpApplication : HttpApplication
{
    protected virtual void Application_Start(object sender, EventArgs e)
    {
        FederatedAuthentication.FederationConfigurationCreated += OnServiceConfigurationCreated;
        FederatedAuthentication.WSFederationAuthenticationModule.SessionSecurityTokenCreated += OnSessionSecurityTokenCreated;
    }

    private void OnServiceConfigurationCreated(object sender, FederationConfigurationCreatedEventArgs e)
    {
    }

    private void OnSessionSecurityTokenCreated(object sender, SessionSecurityTokenCreatedEventArgs e)
    {
    }
}

public class RelyingPartyHttpApplication : GlobalHttpApplication
{
    protected override void Application_Start(object sender, EventArgs e)
    {
        base.Application_Start(sender, e);
    }
}

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

Итак, мой рабочий класс Global.asax выглядит следующим образом:

public class RelyingPartyHttpApplication : HttpApplication
{
    protected void Application_Start()
    {
        FederatedAuthentication.FederationConfigurationCreated += OnServiceConfigurationCreated;
        FederatedAuthentication.WSFederationAuthenticationModule.SessionSecurityTokenCreated += OnSessionSecurityTokenCreated;
    }

    private void OnServiceConfigurationCreated(object sender, FederationConfigurationCreatedEventArgs e)
    {
    }

    private void OnSessionSecurityTokenCreated(object sender, SessionSecurityTokenCreatedEventArgs e)
    {
    }
}
person desperate man    schedule 22.07.2014

Важно отметить, как обрабатывать события SecurityTokenValidated и SessionSecurityTokenCreated класса WSFederationAuthenticationModule: https://stackoverflow.com/а/58561136/5557538

person tibx    schedule 25.10.2019