web-dev-qa-db-fra.com

Authentification fédérée sur Azure

J'utilise WIF (.net 4.5) et Azure Active Directory pour l'authentification. Le site web sera assis sur Azure. 

Tout fonctionne comme prévu localement. Cependant, lorsque je le mets sur Azure, le message d'erreur suivant s'affiche:

L'opération de protection des données a échoué. Cela est peut-être dû au fait que le profil utilisateur n'a pas été chargé pour le contexte utilisateur du thread actuel, ce qui peut être le cas lorsque le thread emprunte l'identité.

Je comprends que cela est dû au fait que les applications ne peuvent pas utiliser DAPI. Je dois donc protéger mon application avec le MAC.

Localement, j'ai ajouté ceci à ma webconfig: -

 <securityTokenHandlers>
    <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>

comme recommandé dans documentation , et j’ai ajouté une clé machine statique, mais je ne trouve aucun conseil concernant la longueur de la clé - j’en ai donc supposé 256.

Cette configuration ne donne cependant que cette erreur: 

[CryptographicException: une erreur s'est produite lors d'une opération cryptographique.] System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.HomogenizeErrors (Func`2 func, Byte [] input) +115 System.Web.Security .Cryptography.HomogenizingCryptoServiceWrapper.Unprotect (Byte [] protectedData) +59 System.Web.Security.MachineKey.Unprotect (ICryptoServiceProvider cryptoServiceProvider, Byte [] protectedData, String [] fins]. .Web.Security.MachineKey.Unprotect (Byte [] protectedData, fins de chaîne []) +122 System.IdentityModel.Services.MachineKeyTransform.Decode (codé par Byte []] +161 Système. IdentitéModèles Tokens.SessionSecurityTokenHandler.ReadToken (jeton Byte [], SûretéTokenRes tokenRes.) .] System.IdentityModel.Services.SessionAuthenticationModule.OnAuthenticateRequest (Expéditeur d'objet, EventArgs eventArgs) +210 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.IExecution). .Web.HttpApplication.ExecuteStep (étape IExecutionStep, Boolean & completedSynchronously) +69

J'ai supprimé la section machinekey au cas où je n'avais pas spécifié de clé correctement formatée, mais l'erreur ne disparaît pas. 

Quel combat WIF a été!

27
Ross Dargan

Si vous ne spécifiez pas machineKey dans la configuration, Azure en ajoute un. Toutefois, si vous créez une nouvelle version de votre application et le déployez sur Azure à l'aide de la commutation VIP, Azure génère une nouvelle clé d'ordinateur pour le déploiement dans Staging (en supposant que votre premier déploiement a été réalisé en production). (La commutation VIP est un mécanisme pratique permettant de déployer une nouvelle version, puis de commuter des adresses IP virtuelles entre Production et Staging).

Donc, une solution consiste essentiellement à laisser Azure générer la clé, mais après le basculement de VIP, le problème persiste. Pour l'éviter, vous pouvez intercepter l'exception CryptographicException dans Global.asax dans le gestionnaire Application_Error, à peu près comme ceci:

// Be sure to reference System.IdentityModel.Services
// and include using System.IdentityModel.Services; 
// at the start of your class
protected void Application_Error(object sender, EventArgs e)
{
    var error = Server.GetLastError();
    var cryptoEx = error as CryptographicException;
    if (cryptoEx != null)
    {
        FederatedAuthentication.WSFederationAuthenticationModule.SignOut();
        Server.ClearError();
    }
}

La méthode SignOut () provoque la suppression du cookie.

Edit : informations mises à jour sur la génération de la clé machine comme indiqué par @anjdreas.

Une autre solution consiste à générer la clé machine, vous pouvez utiliser IIS Manager pour le faire, voir Le moyen le plus simple de générer MachineKey pour plus de détails. Si vous mettez la même clé dans toutes vos applications Web dans Azure Web Role, le processus de déploiement Azure ne la remplacera pas.

48
eXavier

La clé d'ordinateur ne devrait pas être là: Windows Azure en génère une pour vous et veille à ce qu'elle soit identique pour chaque instance de votre rôle.

À propos de l'erreur que vous voyez: pouvez-vous essayer de supprimer les cookies?

3
maartenba

Le simple effacement des cookies a résolu tout le problème pour moi dans ce cas.

2
GGleGrand

Si vous utilisez l'authentification de formulaires. vous pouvez vous déconnecter lorsque vous attrapez l'exception et permettre à vos utilisateurs de se connecter et de créer un cookie valide

catch (CryptographicException cex)
{
    FormsAuthentication.SignOut();
}
0
Ozan BAYRAM