2014-07-22 2 views
0

J'ai des applications ASP.NET MVC 4 (STS et RP) qui utilisent WIF 4.5 pour l'authentification. L'application STS a un service de jeton de sécurité personnalisé et Relying Party appelle STS pour obtenir l'authentification, cette partie fonctionne normalement, mais je ne souhaite pas utiliser cookie pour stocker mes données de jeton, donc je configure les événements dans Global.asax afin d'utiliser la session pour stocker les données, mais je ne peux pas déclencher les événements FederatedAuthentication qui feraient le travail. En mode débogage, la méthode Global.asax Application_Start est invoquée et enregistre tous les événements dont j'ai besoin, mais aucun d'entre eux n'est appelé quand ils sont supposés être appelés. Ce qui est étrange, c'est qu'ils travaillaient, mais soudain ils ont arrêté de tirer et je ne sais pas pourquoi, puisque je n'ai rien changé. J'ai mis en place la méthode Application_Error dans Global.asax et je n'ai aucune erreur et il n'y a rien dans les journaux d'événements Windows.Les événements FederatedAuthentication ne se déclenchent pas

Qu'est-ce qui ne va pas dans ma configuration? Comment puis-je enquêter sur le problème?

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) 
{ 

} 
+0

Ok, je réussi à résoudre une partie du problème en mettant en place mon propre coutume ** WSFederationAuthenticationModule ** et l'enregistrer dans le web.config au lieu du module d'origine. Maintenant, l'événement ** OnSessionSecurityTokenCreated ** est déclenché. Cependant, le problème persiste car je ne sais pas pourquoi le module d'origine ne fonctionne pas comme prévu, mais au moins j'ai une solution de contournement. Merci beaucoup à un gars qui a suggéré cette astuce dans cette question: http://stackoverflow.com/a/14051918/164770 –

Répondre

0

Le problème est résolu. C'était de ma faute.

J'ai créé une classe Global.asax partagée dans une bibliothèque séparée et tous les sites Web de la partie utilisatrice la référençaient (juste pour réduire la duplication de code). Le site Web de RP commence, son propre Global.asax Application_Start est appelé, puis l'Application_Start de la classe de base est appelée, les événements sont enregistrés.

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); 
    } 
} 

Je ne comprends pas vraiment pourquoi les événements ne se déclenchent pas, puisque la Fédération module n'a pas été perdu ni modifié, mais pour certains événements raison enregistrées dans une autre bibliothèque ne se déclenche pas.

donc ma classe Global.asax de travail se présente comme suit:

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) 
    { 
    } 
} 
Questions connexes