使用 ASP.NET MVC 5 和 Unity 依赖注入时令牌无效
Invalid Token when using ASP.NET MVC 5 and Dependency Injection with Unity
我正在构建一个 ASP.NET MVC 5 网站并使用 Unity 进行依赖注入。当令牌生成和令牌验证之间经过一段时间(超过一个小时,不到一天)时,我收到无效令牌异常。
我的 Startup.cs 中有以下代码:
internal static IDataProtectionProvider DataProtectionProvider { get; private set; }
public void Configuration(IAppBuilder app)
{
DataProtectionProvider = app.GetDataProtectionProvider();
ConfigureAuth(app);
}
我的 ApplicationUserManager class 的构造函数中有以下代码(时间跨度现在设置为 7 天只是为了确保这不是问题所在):
var dataProtectionProvider = Startup.DataProtectionProvider;
if (dataProtectionProvider != null)
{
this.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser> (dataProtectionProvider.Create("ASP.NET Identity")) {
TokenLifespan = TimeSpan.FromDays(7)
};
}
在 Startup.Auth.cs 中,我在 ConfigureAuth 方法中有以下代码行:
app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>());
在UnityConfig.cs中,我设置了依赖注入:
container.RegisterType<ApplicationDbContext>();
container.RegisterType<ApplicationSignInManager>();
container.RegisterType<ApplicationUserManager>();
container.RegisterType<ApplicationRoleManager>();
container.RegisterType<IAuthenticationManager>(
new InjectionFactory(c => HttpContext.Current.GetOwinContext().Authentication)
);
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(
new InjectionConstructor(typeof(ApplicationDbContext))
);
container.RegisterType<IRoleStore<IdentityRole, string>, RoleStore<IdentityRole>>(
new InjectionConstructor(typeof(ApplicationDbContext))
);
我必须补充一点,我的一个场景允许创建具有关联用户帐户的联系人。 Contact 和关联的用户帐户在 ContactController 中创建,而 ConfirmEmail 方法在 AccountController 中。两者都将 ApplicationUserManager 作为构造函数参数,这意味着 ApplicationUserManager 被注入到控制器中。
这似乎不是问题所在,因为如果我在收到确认电子邮件后立即确认,一切正常。但是,如果我等待一个小时左右,然后尝试确认,我会收到无效令牌异常。
我已经验证我不是不小心混合了不同的令牌类型,生成和验证都是为了电子邮件确认。我还验证了我正在 url 编码(和解码)令牌。
我目前正在 Azure 虚拟机上进行测试,静态 IP 是 运行 它自己的 IIS,生产环境很可能在非 Azure VPS,als 运行 自己的 IIS。我不是 Azure 专家,但据我所知,我没有 select 任何与负载平衡相关的选项。
非常感谢您的帮助,因为我已经尝试了可以在此处和其他网站上找到的任何可能的解决方案。
无效令牌问题已解决。由于它是在一段时间后才发生的,我认为这可能与我的应用程序回收有关。
我通过在 web.config 中设置固定的 MachineKey 设法解决了这个问题。您可以使用 IIS 管理器生成它,如下所述:https://blogs.msdn.microsoft.com/vijaysk/2009/05/13/iis-7-tip-10-you-can-generate-machine-keys-from-the-iis-manager/
请注意:由于某些原因,IIS 在生成计算机密钥时添加了 IsolateApps。但是,这会导致 ASP.NET 抛出异常。手动删除 IsolateApps 并保存后,它应该会按预期工作。
我正在构建一个 ASP.NET MVC 5 网站并使用 Unity 进行依赖注入。当令牌生成和令牌验证之间经过一段时间(超过一个小时,不到一天)时,我收到无效令牌异常。
我的 Startup.cs 中有以下代码:
internal static IDataProtectionProvider DataProtectionProvider { get; private set; }
public void Configuration(IAppBuilder app)
{
DataProtectionProvider = app.GetDataProtectionProvider();
ConfigureAuth(app);
}
我的 ApplicationUserManager class 的构造函数中有以下代码(时间跨度现在设置为 7 天只是为了确保这不是问题所在):
var dataProtectionProvider = Startup.DataProtectionProvider;
if (dataProtectionProvider != null)
{
this.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser> (dataProtectionProvider.Create("ASP.NET Identity")) {
TokenLifespan = TimeSpan.FromDays(7)
};
}
在 Startup.Auth.cs 中,我在 ConfigureAuth 方法中有以下代码行:
app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>());
在UnityConfig.cs中,我设置了依赖注入:
container.RegisterType<ApplicationDbContext>();
container.RegisterType<ApplicationSignInManager>();
container.RegisterType<ApplicationUserManager>();
container.RegisterType<ApplicationRoleManager>();
container.RegisterType<IAuthenticationManager>(
new InjectionFactory(c => HttpContext.Current.GetOwinContext().Authentication)
);
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(
new InjectionConstructor(typeof(ApplicationDbContext))
);
container.RegisterType<IRoleStore<IdentityRole, string>, RoleStore<IdentityRole>>(
new InjectionConstructor(typeof(ApplicationDbContext))
);
我必须补充一点,我的一个场景允许创建具有关联用户帐户的联系人。 Contact 和关联的用户帐户在 ContactController 中创建,而 ConfirmEmail 方法在 AccountController 中。两者都将 ApplicationUserManager 作为构造函数参数,这意味着 ApplicationUserManager 被注入到控制器中。
这似乎不是问题所在,因为如果我在收到确认电子邮件后立即确认,一切正常。但是,如果我等待一个小时左右,然后尝试确认,我会收到无效令牌异常。
我已经验证我不是不小心混合了不同的令牌类型,生成和验证都是为了电子邮件确认。我还验证了我正在 url 编码(和解码)令牌。
我目前正在 Azure 虚拟机上进行测试,静态 IP 是 运行 它自己的 IIS,生产环境很可能在非 Azure VPS,als 运行 自己的 IIS。我不是 Azure 专家,但据我所知,我没有 select 任何与负载平衡相关的选项。
非常感谢您的帮助,因为我已经尝试了可以在此处和其他网站上找到的任何可能的解决方案。
无效令牌问题已解决。由于它是在一段时间后才发生的,我认为这可能与我的应用程序回收有关。
我通过在 web.config 中设置固定的 MachineKey 设法解决了这个问题。您可以使用 IIS 管理器生成它,如下所述:https://blogs.msdn.microsoft.com/vijaysk/2009/05/13/iis-7-tip-10-you-can-generate-machine-keys-from-the-iis-manager/
请注意:由于某些原因,IIS 在生成计算机密钥时添加了 IsolateApps。但是,这会导致 ASP.NET 抛出异常。手动删除 IsolateApps 并保存后,它应该会按预期工作。