Génération de jeton de réinitialisation de mot de passe ne fonctionne pas dans Azure Site web
Je suis la mise en œuvre de réinitialiser le mot de passe fonctionnalité sur mon site à l'aide de la UserManager
classe qui vient avec ASP.NET 5.
Tout fonctionne très bien dans mon environnement de dev. Cependant, une fois que je l'ai essayer dans le site de production qui est en cours d'exécution comme un site web Azure, j'obtiens l'exception suivante:
Système.De sécurité.La cryptographie.CryptographicException: La protection des données de l'opération a été un échec. Cela peut avoir été causée par ne pas avoir le profil de l'utilisateur chargé pour le thread actuel le contexte de l'utilisateur, qui peut être le cas lorsque le thread est usurper l'identité d'.
C'est de cette façon que je peux configurer le UserManager
exemple:
var provider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider(SiteConfig.SiteName);
UserManager.UserTokenProvider = new Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider<User>(provider.Create(ResetPasswordPurpose));
Puis-je générer le jeton de la même manière (à envoyer à l'utilisateur dans un e-mail afin qu'ils puissent vérifier qu'ils ne sont en effet de vouloir réinitialiser leur mot de passe):
string token = UserManager.GeneratePasswordResetToken(user.Id);
Malheureusement, lorsque cela s'exécute sur Azure, je reçois l'exception ci-dessus.
J'ai Googlé autour et a trouvé ce solution possible. Toutefois, il ne fonctionne pas du tout et j'obtiens toujours la même exception.
Selon le lien, il a quelque chose à voir avec les jetons de session ne fonctionne pas sur une batterie de serveurs web comme Azure.
- Merci de voter sur la question aspnetidentity.codeplex.com/workitem/2439 pour la résolution de ce problème.
- J'obtiens le même message d'erreur lors de l'exécution sur un Azure VM. Est-ce causé par la même chose? Ou devrait-il être une nouvelle question?
Vous devez vous connecter pour publier un commentaire.
La DpapiDataProtectionProvider utilise DPAPI qui ne fonctionnera pas correctement dans une batterie de serveurs web/environnement de cloud depuis de données chiffrées ne peuvent être déchiffrées par la machine qui cryptées elle. Ce que vous avez besoin est un moyen de crypter des données telles qu'il peut être déchiffré par n'importe quel ordinateur dans votre environnement. Malheureusement, ASP.NET Identité 2.0 ne comprennent pas les autres de la mise en œuvre de IProtectionProvider autres que DpapiDataProtectionProvider. Cependant, il n'est pas trop difficile de rouler votre propre.
Une option est d'utiliser le MachineKey classe comme suit:
Pour utiliser cette option, il ya quelques étapes que vous devez suivre.
Étape 1
Modifier votre code pour utiliser la MachineKeyProtectionProvider.
Étape 2
Synchroniser les MachineKey de la valeur dans toutes les machines de votre batterie de serveurs web/environnement de cloud. Cela semble effrayant, mais c'est la même étape que nous avons effectué un nombre incalculable de fois avant afin d'obtenir l'état d'affichage de la validation de travailler correctement dans une batterie de serveurs web (il utilise également DPAPI).
ResetPasswordPurpose
doit être une chaîne de droite? Comme"ResetPasswordPurpose"
?IdentityUser
! Merci!MvcApplication.Application_Start()
.Envisager d'utiliser
IAppBuilder.GetDataProtectionProvider()
au lieu de déclarer une nouvelleDpapiDataProtectionProvider
.Semblable à vous, je vous avais présenté ce problème en configurant mon UserManager comme ça, d'un exemple de code que j'ai trouvé:
La CodePlex problème lié ci-dessus fait référence à une post de blog qui a été mis à jour avec une solution simple à ce problème. Il recommande l'économie d'une référence statique pour les
IDataProtector
......et puis de référencement dans le UserManager
La réponse de johnso fournit également un bon exemple de comment la relier à l'aide de Autofac.
J'ai eu les mêmes problèmes, sauf que j'était d'hébergement sur amazon ec2.
J'ai pu le résoudre en allant sur le pool d'applications IIS et (sous paramètres avancés, après un clic droit) paramètre de modèle de processus - de charger le profil utilisateur = true.
J'ai eu le même problème (
Owin.Security.DataProtection.DpapiDataProtectionProvider
défaut lorsque couru sur Azure), et Staley est correct, vous ne pouvez pas utiliserDpapiDataProtectionProvider
.Si vous utilisez OWIN Classes de Démarrage vous pouvez éviter de rouler votre propre
IDataProtectionProvider
, au lieu d'utiliser l'GetDataProtectionProvider
méthode deIAppBuilder
.Par exemple, avec Autofac:
builder.RegisterInstance(app.GetDataProtectionProvider());
être un meilleur choix?