it-swarm.com.de

Der Datenschutzvorgang war unter Azure mit OWIN/Katana nicht erfolgreich

Ich versuche, das Zurücksetzen von Kennwörtern auf einer OWIN/Katana-basierten ASP.NET MVC-Website in Azure zu implementieren.

Es funktioniert gut, wenn es lokal ausgeführt wird, aber in der Produktion ausfällt.

Ich erstelle einen UserToken Provider

userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("PasswordReset"))

Aber wenn ich versuche, das Token wie folgt zu generieren 

var resetToken = await UserManager.GeneratePasswordResetTokenAsync(user.Id);

Ich bekomme folgende Ausnahme.

System.Security.Cryptography.CryptographicException: Der Schutz der Daten War nicht erfolgreich. Dies wurde möglicherweise dadurch verursacht, dass Das Benutzerprofil nicht für den aktuellen Kontext des Benutzers Des aktuellen Threads geladen wurde. Dies kann der Fall sein, wenn der Thread einen Identitätswechsel durchführt. Unter System.Security. Cryptography.ProtectedData.Protect (Byte [] userData, Byte [] optionalEntropy, DataProtectionScope-Gültigkeitsbereich) Unter System.Security.Cryptography.DpapiDataProtector.ProviderProtect (Byte [] UserData) at System.Security.Cryptography.DataProtector.Protect (Byte [] userData) bei Microsoft.Owin.Security.DataProtection.DpapiDataProtector.Protect (Byte [] userData) um Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider 2.d__0.MoveNext () --- Ende der Stack-Ablaufverfolgung vom vorherigen Speicherort, an dem eine Ausnahme ausgelöst wurde Bei System.Runtime.CompilerServices. TaskAwaiter.ThrowForNonSuccess (Task Task ) Unter System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerN Benachrichtigung (Task Task) unter Microsoft.AspNet.Identity.UserManager`2.d__e9.MoveNext ()

18
Mat Guthrie

Ich habe das gleiche Problem, wenn ich versuche, Token mit ASP .Net-Identität und benutzerdefinierten Anmeldefunktionen in der Web-API zu generieren. 

"Die Datenschutzoperation war nicht erfolgreich. Dies wurde möglicherweise Verursacht, weil das Benutzerprofil nicht für den aktuellen Benutzerkontext des aktuellen Threads geladen wurde. Dies kann der Fall sein, wenn der Thread imitiert wird."

Ich habe einfach eine Anwendungseinstellung mit dem Namen WEBSITE_LOAD_USER_PROFILE in Microsoft Azure erstellt und auf 1 festgelegt. Diese Lösung funktioniert für mich.

Sie können das Detail hier sehen

9
Satria Janaka

Bitte sehen Sie meine meine Antwort auf diese Frage. Eine viel einfachere Lösung kann durch die Verwendung von IAppBuilder.GetDataProtectionProvider() erreicht werden.

5
Loren Paulsen

Ich habe eine Lösung gefunden. Ich bin mir nicht ganz sicher, ob alle Schritte notwendig sind, aber jetzt funktioniert meine App perfekt:

1. Aktualisieren Sie Ihre web.config, um securityTokenHandlers zu unterstützen

<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"/>

im configSections-Knoten. Und

 

  <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">
      <sessionTokenRequirement lifetime="00:30:00"></sessionTokenRequirement>
    </add>
  </securityTokenHandlers>

</identityConfiguration>

als regulärer Knoten. 2.- Aktualisieren Sie in Ihrer Datei Startup.Auth.cs Ihre ConfigureAuth (IAppBuilder-App) wie folgt:

public void ConfigureAuth(IAppBuilder app)
        {

            UserManagerFactory = () =>
            {
                var userManager = new UserManager<SIAgroUser>(new UserStore<UserType>(new SIAgroUserDbContext()));

                IDataProtectionProvider provider = app.GetDataProtectionProvider();

                //userManager.UserTokenProvider = new Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider<UserType>(provider.Create("PasswordReset") );
                if (provider != null)
                {
                    userManager.UserTokenProvider = new DataProtectorTokenProvider<UsertType, string>(provider.Create("PasswordReset"));
                }

                return userManager;
            };

            OAuthOptions = new OAuthAuthorizationServerOptions
            {
                TokenEndpointPath = new PathString("/Token"),
                Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
                AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
                AllowInsecureHttp = true
            };
            // Enable the application to use a cookie to store information for the signed in user
            // and to use a cookie to temporarily store information about a user logging in with a third party login provider
            app.UseCookieAuthentication(new CookieAuthenticationOptions());
            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

            // Enable the application to use bearer tokens to authenticate users
            app.UseOAuthBearerTokens(OAuthOptions);

            // Uncomment the following lines to enable logging in with third party login providers
            //app.UseMicrosoftAccountAuthentication(
            //    clientId: "",
            //    clientSecret: "");

            //app.UseTwitterAuthentication(
            //    consumerKey: "",
            //    consumerSecret: "");

            //app.UseFacebookAuthentication(
            //    appId: "",
            //    appSecret: "");

            //app.UseGoogleAuthentication();



        }

3. Bereinigen Sie den Konstruktor Ihrer Startklasse wie folgt:

static Startup()
{
   PublicClientId = "self";
}

Das hat für mich funktioniert :) Ich hoffe es funktioniert auch für dich

4
JLuis Estrada

Ich habe dieses eine Zeit lang auf Eis gelegt, musste aber dazu zurückkehren. Ich habe die Lösung hier gefunden: Das Generieren des Reset-Kennwort-Tokens funktioniert nicht auf der Azure-Website

2
Mat Guthrie

Dieser Fehler tritt für mich bei einem Shared-Hosting-Provider in der Zeile auf:

var provider = new DpapiDataProtectionProvider("SITENAME");

Die Lösung war ziemlich einfach. Ändern Sie zuerst die obige Zeile:

var provider = new MachineKeyProtectionProvider();

Dann erstellen Sie eine neue Datei, die ich in meinem Utilities-Namespace habe, wie folgt:

using Microsoft.Owin.Security.DataProtection;
using System.Web.Security;

namespace <yournamespace>.Utilities
{
    public class MachineKeyProtectionProvider : IDataProtectionProvider
    {
        public IDataProtector Create(params string[] purposes)
        {
            return new MachineKeyDataProtector(purposes);
        }
    }

    public class MachineKeyDataProtector : IDataProtector
    {
        private readonly string[] _purposes;

        public MachineKeyDataProtector(string[] purposes)
        {
            _purposes = purposes;
        }

        public byte[] Protect(byte[] userData)
        {
            return MachineKey.Protect(userData, _purposes);
        }

        public byte[] Unprotect(byte[] protectedData)
        {
            return MachineKey.Unprotect(protectedData, _purposes);
        }
    }
}

Et voila! Problem gelöst. Denken Sie daran, dass Sie in Ihrer Controller-Reset-Methode auch diesen Provider verwenden müssen, andernfalls wird ein Invalid Token-Fehler angezeigt.

2
Sean

Wenn es sich bei dem Host-Server um eine virtuelle Maschine handelt, könnte dies genau die Fehlermeldung sein. Überprüfen Sie, ob der Anwendungspool in IIS wirklich auf Load User Profile auf true gesetzt ist, wie in der Ausnahme angegeben:

 enter image description here

2
Ogglas

Das Abrufen des UserManagers aus der Owin-Pipeline, wie in App_Start/Startup.Auth.cs festgelegt, funktioniert auf Azure. Ich bin nicht sicher, wie dies konkret funktioniert. Die DpApi sollte in Azure mit der im ersten Link beschriebenen Lösung arbeiten.

Wenn für den DpApi in Web.config ein statischer Computerschlüssel festgelegt ist, können alle Server-Maschinen die verschlüsselten Daten entschlüsseln, die von einem anderen Computer in Ihrer Webfarm erstellt wurden. 

(Code wie in der Standardvorlage angegeben - von AccountController.cs)

 private UserManager userManager;
    public UserManager UserManager
    {
        get { return userManager ?? HttpContext.GetOwinContext().GetUserManager<UserManager>(); }
        private set { userManager = value; }
    }
0
WarrenDodsworth