2017-02-01 21 views
5

Oturum ve Kimlik uyguladığım Azure web sitelerinde barındırılan bir ASP.NET Çekirdek MVC uygulamasına sahibim. Sorunum, 30 dakika sonra oturumu kapatıyorum. Son 30 dakika içinde aktif olup olmadığım önemli değil.ASP.NET Çekirdek web sitesi 30 dakika sonra zaman aşımına uğruyor

Bazı arama yaparken, sorunun SecurityStamp malzemesi, found here olduğunu öğrendim. Ben yaparak bu uygulamaya denedim aşağıdadır:

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add framework services. 
    services.AddApplicationInsightsTelemetry(Configuration); 

    services.AddSingleton(_ => Configuration); 

    services.AddSingleton<IUserStore<Login>, UserStore>(); 
    services.AddSingleton<IRoleStore<Role>, RoleStore>(); 

    services.AddIdentity<Login, Role>(o => 
    { 
     o.Password.RequireDigit = false; 
     o.Password.RequireLowercase = false; 
     o.Password.RequireUppercase = false; 
     o.Password.RequiredLength = 6; 
     o.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(365); 
     o.Cookies.ApplicationCookie.SlidingExpiration = true; 
     o.Cookies.ApplicationCookie.AutomaticAuthenticate = true; 
    }) 
     .AddUserStore<UserStore>() 
     .AddUserManager<UserManager>() 
     .AddRoleStore<RoleStore>() 
     .AddRoleManager<RoleManager>() 
     .AddDefaultTokenProviders(); 

    services.AddScoped<SignInManager<Login>, SignInManager<Login>>(); 
    services.AddScoped<UserManager<Login>, UserManager<Login>>(); 

    services.Configure<AuthorizationOptions>(options => 
    { 
     options.AddPolicy("Admin", policy => policy.Requirements.Add(new AdminRoleRequirement(new RoleRepo(Configuration)))); 
     options.AddPolicy("SuperUser", policy => policy.Requirements.Add(new SuperUserRoleRequirement(new RoleRepo(Configuration)))); 
     options.AddPolicy("DataIntegrity", policy => policy.Requirements.Add(new DataIntegrityRoleRequirement(new RoleRepo(Configuration)))); 
    }); 

    services.Configure<FormOptions>(x => x.ValueCountLimit = 4096); 
    services.AddScoped<IPasswordHasher<Login>, PasswordHasher>(); 

    services.AddDistributedMemoryCache(); 
    services.AddSession(); 

    services.AddMvc(); 

    // repos 
    InjectRepos(services); 

    // services 
    InjectServices(services); 
} 

Ve son olarak: İşte Startup.cs benim ConfigureServices yöntem

public class UserManager : UserManager<Login> 
{ 
    public UserManager(
     IUserStore<Login> store, 
     IOptions<IdentityOptions> optionsAccessor, 
     IPasswordHasher<Login> passwordHasher, 
     IEnumerable<IUserValidator<Login>> userValidators, 
     IEnumerable<IPasswordValidator<Login>> passwordValidators, 
     ILookupNormalizer keyNormalizer, 
     IdentityErrorDescriber errors, 
     IServiceProvider services, 
     ILogger<UserManager<Login>> logger) 
     : base(store, optionsAccessor, passwordHasher, userValidators, passwordValidators, keyNormalizer, errors, services, logger) 
    { 
     // noop 
    } 

    public override bool SupportsUserSecurityStamp => true; 

    public override async Task<string> GetSecurityStampAsync(Login login) 
    { 
     return await Task.FromResult("MyToken"); 
    } 

    public override async Task<IdentityResult> UpdateSecurityStampAsync(Login login) 
    { 
     return await Task.FromResult(IdentityResult.Success); 
    } 
} 

:

Burada güvenlik damga şeylerle benim UserManager impelmentation var burada Startup.cs benim yapılandır bir yöntem vardır:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
    loggerFactory.AddDebug(); 

    app.UseApplicationInsightsRequestTelemetry(); 

    if (env.IsDevelopment()) 
    { 
     app.UseDeveloperExceptionPage(); 
     app.UseDatabaseErrorPage(); 
     app.UseBrowserLink(); 
    } 
    else 
    { 
     app.UseExceptionHandler("/home/error"); 
    } 

    app.UseStatusCodePages(); 

    app.UseStaticFiles(); 

    app.UseSession(); 
    app.UseIdentity(); 

    app.UseMiddleware(typeof (ErrorHandlingMiddleware)); 
    app.UseMiddleware(typeof (RequestLogMiddleware)); 

    app.UseMvc(routes => 
    { 
     routes.MapRoute(
      name: "default", 
      template: "{controller=Home}/{action=Index}/{id?}"); 
    }); 
} 

W şapka benim uygulamada yanlış mı?

UPDATE: Ne bir saniye ... UserManager'ım güvenlik damgasıyla ilgili herhangi bir arabirimden miras almadığını fark ettim, gerekli olan nedir?

cevap

1

IIS altında barındırılıyor musunuz? Öyleyse, kodunuzla ilgili hiçbir şey ters olmayabilir, ancak uygulama havuzunuz geri dönüştürülebilir (uygulama havuzunda gelişmiş ayarları kontrol edin). Bu olduğunda, ikili bilgisayarınız bellekten boşaltıyor ve yeni bir PID değiştiriliyor mu?

+0

Üzgünüm, bu Azure'da barındırılıyor, dolayısıyla IIS üzerinde denetim sahibi olduğuma inanmıyorum. – ganders

3

Bunun nedeni, enable and configure Data Protection'a ihtiyacınız olmasıdır. Çerez ve oturum ayarları doğru görünüyor. Şu anda sizin için olan şey, uygulama geri dönüştürüldüğünde ya da sunucu yükünün başka bir sunucuya veya yeni bir dağıtımla ne zaman dengelendiği, vb., Bellekte yeni bir Veri koruma anahtarı oluşturmasıdır, böylece kullanıcılarınızın oturum anahtarları geçersizdir. , REDIS

services.AddDataProtection() 
     .PersistKeysToFileSystem(new DirectoryInfo(@"D:\writable\temp\directory\")) 
     .SetDefaultKeyLifetime(TimeSpan.FromDays(14)); 

düzgün Bunu ayarlamak ve Veri Koruma anahtarını (dosya sistemini nereye kaydedileceğini farklı seçenekler öğrenmek için belgelere kullanın: Yani yapmanız gereken Startup.cs aşağıdakileri ekleyin edilir kayıt, vb. Veri koruma anahtarını, web.config'ın makinenin anahtarı olarak asp.net'de değiştirmeyi düşünebilirsiniz.

Azure'u kullandığınızdan bahsettiğinize göre, anahtarı korumak için bu paketi Microsoft.AspNetCore.DataProtection.AzureStorage kullanabilirsiniz. Yani use this example of how to use Azure Storage olabilir.

+0

Yani, uygulama havuzum her 30 dakikada bir geri dönüştürülüyor ve en son giriş yaptığım süre ile senkronize ediliyor? Bu bana mantıklı gelmiyor. – ganders

+0

Muhtemelen çoğu zaman geri dönüştürülmez, hayır. Ancak AspNetCore dokümantasyonunda Veri koruma anahtarlarının varsayılan olarak bellekte üretildiğinden bahsedilmektedir - ve bu veri koruma anahtarının kullanıcı için geçerli olmayacak olan oturum ve kimlik tanımlama bilgisi verilerini (ayrıca ValidateAntiForgeryToken eylem filtresi) koruyan unsurları nelerdir? değişir. – truemedia

+0

Fark ettim [Veri Koruması için varsayılan ayarlar] (https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/default-settings#data-protection-default-settings) Azure üzerinde sizi kurmak için oldukça iyi. Basitçe kodu ekleyebilirsiniz, 'services.AddDataProtection(); 've yukarı ve çalışıyor olmalısınız. Azure sizin için anahtarları otomatik olarak sürdürecektir. Ayrıca, IIS kullanan herkes için, “PersistKeysToFileSystem” seçeneğine gerek kalmadan tek bir makinede de çalışırlar, çünkü varsayılan ayarlar dokümanlardaki gibi iyi ayarlanmışlardır. – truemedia