2012-09-23 1 views
4

J'ai créé un projet MVC 4 et l'ai configuré pour Azure ACS. Cela a fonctionné avec System.Identity. Je l'ai changé pour utiliser le Microsoft.Identity pour permettre WIF et mon fichier de configuration ressemble à ceci maintenant:CryptographicException: Les données ne sont pas valides dans MVC 4 avec WIF activé

<?xml version="1.0" encoding="utf-8"?> 
<!-- 
    For more information on how to configure your ASP.NET application, please visit 
    http://go.microsoft.com/fwlink/?LinkId=169433 
    --> 
<configuration> 
    <configSections> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    <section name="microsoft.identityModel" 
      type="Microsoft.IdentityModel.Configuration.MicrosoftIdentityModelSection, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
    </configSections> 
    <connectionStrings> 

    <add name="DefaultConnection" /> 
    </connectionStrings> 
    <appSettings> 
    <add key="webpages:Version" value="2.0.0.0" /> 
    <add key="webpages:Enabled" value="false" /> 
    <add key="PreserveLoginUrl" value="true" /> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 
    <add key="ida:FederationMetadataLocation" value="https://traffictheory.accesscontrol.windows.net/FederationMetadata/2007-06/FederationMetadata.xml" /> 
    <add key="ida:ProviderSelection" value="ACS" /> 
    </appSettings> 
    <location path="FederationMetadata"> 
    <system.web> 
     <authorization> 
     <allow users="*" /> 
     </authorization> 
    </system.web> 
    </location> 
    <system.web> 
    <!--<authorization> 
     <deny users="?" /> 
    </authorization>--> 
    <authentication mode="None" /> 
    <compilation debug="true" targetFramework="4.0" /> 
    <!--Commented out by Identity and Access VS Package--> 
    <!--<authentication mode="Forms"><forms loginUrl="~/Account/Login" timeout="2880" /></authentication>--> 
    <pages> 
     <namespaces> 
     <add namespace="System.Web.Helpers" /> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Optimization" /> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="System.Web.WebPages" /> 
     </namespaces> 
    </pages> 
    <httpRuntime requestValidationMode="4.5" /> 
    </system.web> 
    <system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="WSFederationAuthenticationModule" 
     type="Microsoft.IdentityModel.Web.WSFederationAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
     <add name="SessionAuthenticationModule" 
      type="Microsoft.IdentityModel.Web.SessionAuthenticationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
     <add name="ClaimsAuthorizationModule" 
      type="Microsoft.IdentityModel.Web.ClaimsAuthorizationModule, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 

    </modules> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    </system.webServer> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
    <entityFramework> 
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" /> 
    </entityFramework> 
    <microsoft.identityModel> 
    <service> 
     <audienceUris> 
     <add value="http://localhost:48451/" /> 
     </audienceUris> 

    <issuerNameRegistry type="Microsoft.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, Microsoft.IdentityModel, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> 
     <trustedIssuers> 
     <add thumbprint="033F53598E4ED92E51C07238E36BBFF4E67ABAD2" name="https://traffictheory.accesscontrol.windows.net/" /> 
     </trustedIssuers> 
    </issuerNameRegistry> 

    <federatedAuthentication> 
     <cookieHandler requireSsl="false" /> 
     <wsFederation passiveRedirectEnabled="true" 
        issuer="https://traffictheory.accesscontrol.windows.net/v2/wsfederation" 
        realm="http://localhost:48451/" reply="http://localhost:48451/" 
        requireHttps="false" /> 
    </federatedAuthentication> 
     <certificateValidation certificateValidationMode="None" /> 
     </service> 
    </microsoft.identityModel> 

</configuration> 

Mon problème est quand je lance le site je reçois:

[CryptographicException: The data is invalid. 
] 
    System.Security.Cryptography.ProtectedData.Unprotect(Byte[] encryptedData, Byte[] optionalEntropy, DataProtectionScope scope) +318 
    Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Decode(Byte[] encoded) +203 

[InvalidOperationException: ID1073: A CryptographicException occurred when attempting to decrypt the cookie using the ProtectedData API (see inner exception for details). If you are using IIS 7.5, this could be due to the loadUserProfile setting on the Application Pool being set to false. ] 
    Microsoft.IdentityModel.Web.ProtectedDataCookieTransform.Decode(Byte[] encoded) +319 
    Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ApplyTransforms(Byte[] cookie, Boolean outbound) +217 
    Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(XmlReader reader, SecurityTokenResolver tokenResolver) +1951 
    Microsoft.IdentityModel.Tokens.SessionSecurityTokenHandler.ReadToken(Byte[] token, SecurityTokenResolver tokenResolver) +149 
    Microsoft.IdentityModel.Web.SessionAuthenticationModule.ReadSessionTokenFromCookie(Byte[] sessionCookie) +598 
    Microsoft.IdentityModel.Web.SessionAuthenticationModule.TryReadSessionTokenFromCookie(SessionSecurityToken& sessionToken) +120 
    Microsoft.IdentityModel.Web.SessionAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs eventArgs) +113 
    System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +136 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69 

Répondre

6

La protection par défaut WIF utilise DPAPI qui échoue si le profil n'a pas été chargé (échoue généralement dans l'hébergement cloud). Vous pouvez utiliser une protection MachineKey à la place qui repose sur la machine ASP.NET clé

http://leastprivilege.com/2012/07/12/machinekey-based-session-protection-for-wif/

D'autre part, si vous utilisez NET 4.5 et System.IdentityModel qui est intégré. Vous n'avez plus besoin de WIF et la protection de la clé de la machine est déjà disponible dans l'assemblage de base. En outre, vous devrez référencer System.IdentityModel.Services dll (qui contient les modules http)

+2

Je l'ai compris, le problème semblait être associé au cache du navigateur. L'effacement du cache a résolu le problème. Azure ne supporte pas encore NET 4.5. –

+0

J'ai remarqué un problème avec l'API MachineKey lorsqu'il est utilisé dans une application ASP.NET. Il ne parvient pas à déchiffrer les données après le redémarrage de l'application. La même application a certaines données protégées en utilisant DPAPI qui fonctionne bien. J'essaie de comprendre quelle serait la cause. – Leadfoot

+0

@Leadfoot avez-vous eu une mise à jour sur votre problème après le redémarrage de l'application? –

0

Vous ne pouvez pas nécessairement demander à vos visiteurs d'effacer leurs cookies lorsque tout ce qu'ils voient est cette exception.

Ma réponse est d'aider les autres qui ont retiré leurs cheveux en raison de cette CryptographicException 'data is invalid' avec l'authentification fédérée. Nous avons essayé beaucoup de choses et aucune n'a fonctionné excepté que j'ai trouvé une mention de changer le nom du biscuit parce que passant du WIF 3.5 à la version 4.0 il semble que des biscuits incompatibles aient pu être laissés pour compte. Nous ne savons toujours pas pourquoi. Cependant, dans notre cas, nous avions deux dossiers d'application virtuelle chacun avec l'authentification fédérée et il a semblé qu'ils aient pu partager des biscuits. Ainsi, nous avons spécifié un nom de cookie unique à la fois pour le cookieHandler de chacun dans l'authentification fédérée, et nous avons également spécifié le cookie de session asp.net pour avoir un nom unique pour chacun. Si cet indice aide quelqu'un, alors super.

Questions connexes