我在尝试创建或更新用户时遇到此错误。 完整的错误是:
数据保护操作失败。这可能是由于没有为当前线程的用户上下文加载用户配置文件引起的,这可能是线程模拟时的情况。
我们在我们的应用程序中使用autofac,所以我after reading this article我创建了我自己的 IdentityFactoryOptions ,如下所示:
public class IdentityFactoryOptions: IdentityFactoryOptions<UserProvider>
{
public IdentityFactoryOptions()
{
DataProtectionProvider = new DpapiDataProtectionProvider("ASP.NET Identity");
}
}
然后我创建了我自己的 DataProtectionTokenProvider ,如下所示:
public class DataProtectionTokenProvider : DataProtectorTokenProvider<User>
{
public DataProtectionTokenProvider(IdentityFactoryOptions options) : base(options.DataProtectionProvider.Create("ASP.NET Identity"))
{
TokenLifespan = TimeSpan.FromHours(6);
}
}
我将这两个注册为 SingleInstances ,如下所示:
builder.RegisterType<IdentityFactoryOptions>().AsSelf().SingleInstance();
builder.RegisterType<DataProtectionTokenProvider>().AsSelf().SingleInstance();
我将 DataProtectionTokenProvider 注入我的 UserManager ,并在管理器构造函数中将其指定为:
UserTokenProvider = dataProtectionTokenProvider;
但在完成所有这些之后,我仍然得到错误。 我也read this article,看到你也必须更新你的web.config,所以我添加了这个:
<system.identityModel>
<identityConfiguration>
<securityTokenHandlers>
<add type="System.IdentityModel.Services.Tokens.MachineKeySessionSecurityTokenHandler, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<remove type="System.IdentityModel.Tokens.SessionSecurityTokenHandler, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</securityTokenHandlers>
</identityConfiguration>
</system.identityModel>
但错误仍然存在。 有人有任何解决方案吗?这让我很生气....
答案 0 :(得分:1)
好的,我设法解决了这个问题。 使用我链接的第一篇文章,我将 IAppBuilder 注入我的autofac模块并删除了我的 IdentityFactoryOptions 类。所以注册现在看起来像这样:
builder.Register(m => new DataProtectorTokenProvider(_app.GetDataProtectionProvider())).AsSelf().SingleInstance();
DataProtectorTokenProvider如下所示:
public class DataProtectorTokenProvider : DataProtectorTokenProvider<User>
{
public DataProtectorTokenProvider(IDataProtectionProvider dataProtectionProvider) : base(dataProtectionProvider.Create("ASP.NET Identity"))
{
TokenLifespan = TimeSpan.FromHours(6);
}
}
其他一切我保持不变。这解决了这个问题。