title: Error occurred during a cryptographic operation in debug
body: <p>I'm getting the below error.  This seems to have only started after I upgraded my visual studio 2015 to have the first update.  I have read a few threads here about this being an issue with the machine key?  I'm not sure how to fix it though and prevent it.  Currently I'm getting this error on my local machine when I run this in debug using IIS express.</p>
  
  <p><code>Exception Details: System.Security.Cryptography.CryptographicException: Error occurred during a cryptographic operation.</code></p>
  
  <pre><code>Cache = db.UserTokenCacheList.FirstOrDefault(c =&gt; c.webUserUniqueId == userId);
  
  // place the entry in memory
  this.Deserialize((Cache == null) ? null : MachineKey.Unprotect(Cache.cacheBits,"ADALCache"));
  
  
  [CryptographicException: Error occurred during a cryptographic operation.]
     System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.HomogenizeErrors(Func`2 func, Byte[] input) +115
     System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.Unprotect(Byte[] protectedData) +70
     System.Web.Security.MachineKey.Unprotect(ICryptoServiceProvider cryptoServiceProvider, Byte[] protectedData, String[] purposes) +62
     System.Web.Security.MachineKey.Unprotect(Byte[] protectedData, String[] purposes) +121
     LEDES.Models.ADALTokenCache..ctor(String signedInUserId) in C:\Users\RLewis\Source\Workspaces\Workspace\LEDES\LEDES\Models\AdalTokenCache.cs:28
     LEDES.Startup.&lt;ConfigureAuth&gt;b__7_0(AuthorizationCodeReceivedNotification context) in C:\Users\RLewis\Source\Workspaces\Workspace\LEDES\LEDES\App_Start\Startup.Auth.cs:54
     Microsoft.Owin.Security.OpenIdConnect.&lt;AuthenticateCoreAsync&gt;d__1a.MoveNext() +4388
     System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +26
     Microsoft.Owin.Security.OpenIdConnect.&lt;AuthenticateCoreAsync&gt;d__1a.MoveNext() +5776
     System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92
     System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
     System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() +28
     Microsoft.Owin.Security.Infrastructure.&lt;BaseInitializeAsync&gt;d__0.MoveNext() +471
     System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92
     System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
     System.Runtime.CompilerServices.TaskAwaiter.GetResult() +26
     Microsoft.Owin.Security.Infrastructure.&lt;Invoke&gt;d__0.MoveNext() +218
     System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92
     System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
     System.Runtime.CompilerServices.TaskAwaiter.GetResult() +26
     Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.&lt;RunApp&gt;d__5.MoveNext() +170
     System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92
     System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
     System.Runtime.CompilerServices.TaskAwaiter.GetResult() +26
     Microsoft.Owin.Security.Infrastructure.&lt;Invoke&gt;d__0.MoveNext() +525
     System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92
     System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
     System.Runtime.CompilerServices.TaskAwaiter.GetResult() +26
     Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.&lt;RunApp&gt;d__5.MoveNext() +170
     System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92
     System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58
     System.Runtime.CompilerServices.TaskAwaiter.GetResult() +26
     Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.&lt;DoFinalWork&gt;d__2.MoveNext() +166
     System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() +26
     Microsoft.Owin.Host.SystemWeb.Infrastructure.ErrorState.Rethrow() +26
     Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar) +81
     Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) +30
     System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +380
     System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously) +155
  </code></pre>
  
  <p>Here is the code from the where it is failing - This was generated by VS when i choose the Azure authentication when setting up the project.</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.ComponentModel.DataAnnotations;
  using System.Data.Entity;
  using System.Linq;
  using System.Web;
  using System.Web.Security;
  using Microsoft.IdentityModel.Clients.ActiveDirectory;
  
  namespace LEDES.Models
  {
      public class ADALTokenCache : TokenCache
      {
          private ApplicationDbContext db = new ApplicationDbContext();
          private string userId;
          private UserTokenCache Cache;
  
          public ADALTokenCache(string signedInUserId)
          {
              // associate the cache to the current user of the web app
              userId = signedInUserId;
              this.AfterAccess = AfterAccessNotification;
              this.BeforeAccess = BeforeAccessNotification;
              this.BeforeWrite = BeforeWriteNotification;
              // look up the entry in the database
              Cache = db.UserTokenCacheList.FirstOrDefault(c =&gt; c.webUserUniqueId == userId);
              // place the entry in memory
              this.Deserialize((Cache == null) ? null : MachineKey.Unprotect(Cache.cacheBits,"ADALCache"));
          }
  
          // clean up the database
          public override void Clear()
          {
              base.Clear();
              var cacheEntry = db.UserTokenCacheList.FirstOrDefault(c =&gt; c.webUserUniqueId == userId);
              db.UserTokenCacheList.Remove(cacheEntry);
              db.SaveChanges();
          }
  
          // Notification raised before ADAL accesses the cache.
          // This is your chance to update the in-memory copy from the DB, if the in-memory version is stale
          void BeforeAccessNotification(TokenCacheNotificationArgs args)
          {
              if (Cache == null)
              {
                  // first time access
                  Cache = db.UserTokenCacheList.FirstOrDefault(c =&gt; c.webUserUniqueId == userId);
              }
              else
              { 
                  // retrieve last write from the DB
                  var status = from e in db.UserTokenCacheList
                               where (e.webUserUniqueId == userId)
                  select new
                  {
                      LastWrite = e.LastWrite
                  };
  
                  // if the in-memory copy is older than the persistent copy
                  if (status.First().LastWrite &gt; Cache.LastWrite)
                  {
                      // read from from storage, update in-memory copy
                      Cache = db.UserTokenCacheList.FirstOrDefault(c =&gt; c.webUserUniqueId == userId);
                  }
              }
              this.Deserialize((Cache == null) ? null : MachineKey.Unprotect(Cache.cacheBits, "ADALCache"));
          }
  
          // Notification raised after ADAL accessed the cache.
          // If the HasStateChanged flag is set, ADAL changed the content of the cache
          void AfterAccessNotification(TokenCacheNotificationArgs args)
          {
              // if state changed
              if (this.HasStateChanged)
              {
                  Cache = new UserTokenCache
                  {
                      webUserUniqueId = userId,
                      cacheBits = MachineKey.Protect(this.Serialize(), "ADALCache"),
                      LastWrite = DateTime.Now
                  };
                  // update the DB and the lastwrite 
                  db.Entry(Cache).State = Cache.UserTokenCacheId == 0 ? EntityState.Added : EntityState.Modified;
                  db.SaveChanges();
                  this.HasStateChanged = false;
              }
          }
  
          void BeforeWriteNotification(TokenCacheNotificationArgs args)
          {
              // if you want to ensure that no concurrent write take place, use this notification to place a lock on the entry
          }
  
          public override void DeleteItem(TokenCacheItem item)
          {
              base.DeleteItem(item);
          }
      }
  }
  </code></pre>
  
  <p>Info from call stack and the point of hitting the CryptographicEsception occured</p>
  
  <pre><code>    System.Web.dll!System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.HomogenizeErrors(System.Func&lt;byte[], byte[]&gt; func, byte[] input)   Unknown
      System.Web.dll!System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.Unprotect(byte[] protectedData)    Unknown
      System.Web.dll!System.Web.Security.MachineKey.Unprotect(System.Web.Security.Cryptography.ICryptoServiceProvider cryptoServiceProvider, byte[] protectedData, string[] purposes) Unknown
      System.Web.dll!System.Web.Security.MachineKey.Unprotect(byte[] protectedData, string[] purposes)    Unknown
  &gt;   LEDES.dll!LEDES.Models.ADALTokenCache.ADALTokenCache(string signedInUserId) Line 28 C#
      LEDES.dll!LEDES.Startup.ConfigureAuth.AnonymousMethod__7_0(Microsoft.Owin.Security.Notifications.AuthorizationCodeReceivedNotification context) Line 54 C#
      Microsoft.Owin.Security.OpenIdConnect.dll!Microsoft.Owin.Security.OpenIdConnect.OpenIdConnectAuthenticationHandler.AuthenticateCoreAsync()  Unknown
      mscorlib.dll!System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.InvokeMoveNext(object stateMachine)  Unknown
      mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)   Unknown
      mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)   Unknown
      mscorlib.dll!System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.Run()    Unknown
      mscorlib.dll!System.Threading.Tasks.AwaitTaskContinuation.InvokeAction(object state)    Unknown
      mscorlib.dll!System.Threading.Tasks.AwaitTaskContinuation.RunCallback(System.Threading.ContextCallback callback, object state, ref System.Threading.Tasks.Task currentTask) Unknown
      mscorlib.dll!System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation.Run(System.Threading.Tasks.Task task, bool canInlineContinuationTask)   Unknown
      mscorlib.dll!System.Threading.Tasks.Task.FinishContinuations()  Unknown
      mscorlib.dll!System.Threading.Tasks.Task.FinishStageThree() Unknown
      mscorlib.dll!System.Threading.Tasks.Task&lt;System.__Canon&gt;.TrySetResult(System.__Canon result)    Unknown
      mscorlib.dll!System.Runtime.CompilerServices.AsyncTaskMethodBuilder&lt;Microsoft.Owin.IFormCollection&gt;.SetResult(Microsoft.Owin.IFormCollection result)    Unknown
      Microsoft.Owin.dll!Microsoft.Owin.OwinRequest.ReadFormAsync()   Unknown
      mscorlib.dll!System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.InvokeMoveNext(object stateMachine)  Unknown
      mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)   Unknown
      mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)   Unknown
      mscorlib.dll!System.Runtime.CompilerServices.AsyncMethodBuilderCore.MoveNextRunner.Run()    Unknown
      mscorlib.dll!System.Threading.Tasks.SynchronizationContextAwaitTaskContinuation..cctor.AnonymousMethod__8_0(object state)   Unknown
      System.Web.dll!System.Web.AspNetSynchronizationContext.Post.AnonymousMethod__0()    Unknown
      System.Web.dll!System.Web.Util.SynchronizationHelper.SafeWrapCallback(System.Action action) Unknown
      System.Web.dll!System.Web.Util.SynchronizationHelper.QueueAsynchronous.AnonymousMethod__0(System.Threading.Tasks.Task _)    Unknown
      mscorlib.dll!System.Threading.Tasks.ContinuationTaskFromTask.InnerInvoke()  Unknown
      mscorlib.dll!System.Threading.Tasks.Task.Execute()  Unknown
      mscorlib.dll!System.Threading.Tasks.Task.ExecutionContextCallback(object obj)   Unknown
      mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)   Unknown
      mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)   Unknown
      mscorlib.dll!System.Threading.Tasks.Task.ExecuteWithThreadLocal(ref System.Threading.Tasks.Task currentTaskSlot)    Unknown
      mscorlib.dll!System.Threading.Tasks.Task.ExecuteEntry(bool bPreventDoubleExecution) Unknown
      mscorlib.dll!System.Threading.Tasks.Task.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() Unknown
      mscorlib.dll!System.Threading.ThreadPoolWorkQueue.Dispatch()    Unknown
      mscorlib.dll!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback() Unknown
      [Native to Managed Transition]  
  </code></pre>