Witam. Takie pytanko jak obsłużyć koniec sesji przy skonfigurowanym Autofacu w aplikacji webowe ASP MVC 5.
Po zalogowaniu się usera klasy są wstrzykiwane do controllera i wszystko ładnie działa. Problem jest gdy wygasa sesja. Jak kliknę na jakieś menu to mam exception, że brak controllera o bez parametrowym konstruktorze. Czyli tak jakby nie mógł wstrzyknąć nic z Autofaca i uruchamia się metoda Application_error() z GlobalAsax.cs. Chciałbym to jakoś ładnie obsłużyć np z przekierowaniem na stronę, że sesja wygasła. Jakie są dostępne opcje aby ładnie to zrobić. Czy w Application_error sprawdzać stan sesji i jeśli jest zakończona to przekierowanie na odpowiednią stronę ?
private void ConfigureContainer()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterAssemblyModules(typeof(MvcApplication).Assembly);
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}
public class ServiceModule : Autofac.Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<ApplicationDbContext>().AsSelf().InstancePerRequest();
builder.RegisterType<DelegationService>().AsSelf().InstancePerRequest();
builder.RegisterType<DataAccess>().AsSelf().InstancePerRequest();
builder.RegisterType<AdminService>().AsSelf().InstancePerRequest();
builder.RegisterType<AccountancyService>().AsSelf().InstancePerRequest();
builder.RegisterType<AccountCreator>().AsSelf().InstancePerRequest();
builder.RegisterType<PdfService>().AsSelf().InstancePerRequest();
builder.RegisterType<SummaryDelService>().AsSelf().InstancePerRequest();
builder.RegisterType<BLL.EmailService>().AsSelf().InstancePerRequest();
builder.RegisterType<CarService>().AsSelf().InstancePerRequest();
builder.RegisterType<UserNotifyService>().AsSelf().InstancePerRequest();
builder.RegisterType<ManagerService>().AsSelf().InstancePerRequest();
builder.RegisterType<ApplicationUserManager>().AsSelf().InstancePerRequest();
builder.RegisterType<ApplicationSignInManager>().AsSelf().InstancePerRequest();
var dbContextParameter = new ResolvedParameter((pi, ctx) => pi.ParameterType == typeof(DbContext),
(pi, ctx) => ctx.Resolve<ApplicationDbContext>());
builder.RegisterType<UserStore<ApplicationUser>>().WithParameter(dbContextParameter).InstancePerLifetimeScope();
//var userStore = new ResolvedParameter((pi, ctx) => pi.ParameterType == typeof(UserStore<ApplicationUser>), (pi, ctx) => ctx.Resolve<UserStore<ApplicationUser>>());
//builder.RegisterType<UserManager<ApplicationUser>>().WithParameter(userStore);
builder.Register(c => new UserStore<ApplicationUser>(c.Resolve<ApplicationDbContext>())).AsImplementedInterfaces().InstancePerRequest();
builder.Register(c => new UserManager<ApplicationUser>(c.Resolve<UserStore<ApplicationUser>>())).AsSelf().InstancePerRequest();
builder.Register(c => HttpContext.Current.GetOwinContext().Authentication).As<IAuthenticationManager>();
builder.Register(c => new IdentityFactoryOptions<ApplicationUserManager>
{
DataProtectionProvider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("Delegacje")
});
builder.Register(
c => c.Resolve<ApplicationUserManager>().FindById(HttpContext.Current.User.Identity.GetUserId()))
.As<ApplicationUser>();
builder.RegisterType<UserService>().AsSelf().InstancePerRequest();
builder.RegisterType<CurrencyService>().AsSelf().InstancePerRequest();
}
}
public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
ExpireTimeSpan = TimeSpan.FromMinutes(1),
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Logowanie/Index"),
SlidingExpiration = true,
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(1),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
}