2017-07-14 20 views
0

使用Autofac時,在Azure上託管我的應用程序時,我收到此錯誤:數據保護操作不成功Azure上

數據保護操作不成功。這可能是因爲沒有爲當前線程的用戶上下文加載用戶配置文件,這可能是線程模擬時的情況。

嘗試創建用戶或重新發送確認電子郵件時。 文章:

http://tech.trailmax.info/2014/06/asp-net-identity-and-cryptographicexception-when-running-your-site-on-microsoft-azure-web-sites/

說,你應該創建啓動類的單一實例,但我使用autofac,所以我這樣做:

builder.Register(c => new IdentityFactoryOptions<UserProvider>() { DataProtectionProvider = new DpapiDataProtectionProvider(c.Resolve<PiiiCKConfig>().Issuer) }).SingleInstance(); 

,然後在我的的UserManager構造函數,我這樣做:

// Get our data protection provider 
var dataProtectionProvider = options.DataProtectionProvider; 

// If we have on 
if (dataProtectionProvider != null) 
{ 

    // Set our token provider 
    UserTokenProvider = new DataProtectorTokenProvider<User>(dataProtectionProvider.Create("PiiiK Identity")) 
    { 

     // Set our long the email confirmation token will last 
     TokenLifespan = TimeSpan.FromHours(6) 
    }; 
} 

但我仍然得到錯誤。 有誰知道我可以如何解決這個問題?

+0

是否https://stackoverflow.com/questions/23773651/the-data-protection-operation-was - 不成功的天藍色使用owin-katana的幫助? – mjwills

+0

nope,我在創建這篇文章之前試過 – r3plica

回答

1

根據你的描述,我檢查了我的問題,我可以重現這個問題。根據我的測試,你可以按照下面的方法來解決這個問題:

builder.Register(c => new IdentityFactoryOptions<UserProvider>() { DataProtectionProvider = new DpapiDataProtectionProvider(c.Resolve<PiiiCKConfig>().Issuer) }).SingleInstance(); 

你可以使用IAppBuilder.GetDataProtectionProvider(),而不是宣佈新DpapiDataProtectionProvider,根據上面的代碼,你需要進行如下修改:

builder.Register(c => new IdentityFactoryOptions<UserProvider>() 
{ 
    DataProtectionProvider = app.GetDataProtectionProvider() 
}).SingleInstance(); 

或者

builder.Register<IDataProtectionProvider>(c => app.GetDataProtectionProvider()).SingleInstance(); 

此外,這裏是一個類似的問題,你可以參考here

UPDATE:

這裏是Startup.Auth.cs的代碼片段如下:

public partial class Startup 
{ 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     var builder = new ContainerBuilder(); 
     builder.RegisterControllers(typeof(MvcApplication).Assembly); 

     builder.Register(c => new IdentityFactoryOptions<ApplicationUserManager>() 
     { 
      DataProtectionProvider = app.GetDataProtectionProvider() 
     }).SingleInstance(); 

     //Or 
     //builder.Register<IDataProtectionProvider>(c =>app.GetDataProtectionProvider()).SingleInstance(); 

     var container = builder.Build(); 
     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
    } 
} 
+0

如何將IAppBuilder導入到我的覆蓋加載方法中? – r3plica

+1

我做得稍微不同。我設置了一個'Module',所以我只是爲'IAppBuilder'界面創建了一個公共屬性,並且像這樣創建了它:'builder.RegisterModule(new AutofacModule(){App = app});'並且工作正常。我會標記你的答案是正確的:) – r3plica