使用ASP.NET MVC 5和依赖注入与Unity

时间:2016-06-27 12:16:27

标签: asp.net asp.net-mvc dependency-injection asp.net-mvc-5 asp.net-identity-2

我正在构建一个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类的结构中有以下代码(timepan设置为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))
);

我必须补充一点,我的一个场景允许创建与关联用户帐户的联系人。联系人和关联的用户帐户在ContactController中创建,而ConfirmEmail方法在AccountController中。两者都将ApplicationUserManager作为构造函数参数,这意味着将ApplicationUserManager注入控制器。

这似乎不是问题,因为如果我在收到确认电子邮件后立即确认,一切正常。但是,如果我等了一个小时左右,然后尝试确认,我会收到无效令牌异常。

我已经确认我没有意外混合不同的令牌类型,生成和验证都用于确认电子邮件。我还验证了我是url编码(和解码)令牌。

我目前正在使用运行自己的IIS的静态IP在Azure虚拟机上进行测试,生产环境很可能位于非Azure VPS上,运行自己的IIS。我不是Azure专家,但据我所知,我没有选择任何与负载平衡相关的选项。

我真的很感谢你的帮助,因为我已经尝试过任何可能的解决方案,我可以在这里和其他网站上找到。

1 个答案:

答案 0 :(得分:0)

无效令牌问题已解决。由于它只是在经过一段时间后才发生,我认为它可能与我的应用程序回收有关。

我设法通过在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并保存后,它应该按预期工作。