2017-02-01 8 views
5

मुझे एएसपी.NET कोर एमवीसी ऐप मिला है, जो Azure वेबसाइटों पर होस्ट किया गया है, जहां मैंने सत्र और पहचान लागू की है। मेरी समस्या है, 30 मिनट के बाद, मैं लॉग आउट हो गया। इससे कोई फर्क नहीं पड़ता कि मैं पिछले 30 मिनट में सक्रिय हूं या नहीं।एएसपी.NET कोर वेबसाइट 30 मिनट के बाद समय समाप्त हो रही है

कुछ खोज करना, मैंने पाया कि यह समस्या सुरक्षा स्टाम्प सामग्री है, found here। मैं ऐसा करके इस को लागू निम्नलिखित को आज़मा चुके:

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); 
    } 
} 

यहाँ Startup.cs पर मेरे ConfigureServices विधि:

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); 
} 

और अंत में

यहाँ सुरक्षा टिकट सामान के साथ अपने UserManager impelmentation है , यहां Startup.cs पर मेरी कॉन्फ़िगर विधि है:

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?}"); 
    }); 
} 

डब्ल्यू मेरे कार्यान्वयन के साथ टोपी गलत है?

अद्यतन: क्या दूसरा ... मैंने देखा कि मेरा उपयोगकर्ता प्रबंधक सुरक्षा स्टैम्प सामान के लिए किसी भी इंटरफेस से विरासत में नहीं है, क्या इसकी आवश्यकता है?

उत्तर

1

क्या आप आईआईएस के तहत होस्ट किए गए हैं? यदि ऐसा है, तो हो सकता है कि आपके कोड में कुछ भी गलत न हो, लेकिन आपका एप्लिकेशन पूल रीसाइक्लिंग हो सकता है (एप्लिकेशन पूल पर उन्नत सेटिंग्स जांचें)। जब ऐसा होता है, तो क्या आपकी द्विआधारी स्मृति से उतारती है और एक नया स्थान बदलती है, इसकी पीआईडी ​​बदलती है?

+0

क्षमा करें, यह Azure पर होस्ट किया गया है, इसलिए मुझे विश्वास नहीं है कि मेरे पास आईआईएस पर नियंत्रण है। – ganders

3

यह केवल इसलिए है क्योंकि आपको enable and configure Data Protection की आवश्यकता है। कुकी और सत्र सेटअप सही दिखता है। आपके लिए अभी क्या हो रहा है कि जब भी ऐप रीसाइक्लिंग किया जाता है या सर्वर किसी अन्य सर्वर पर बैलेंस लोड करता है या एक नई तैनाती होती है, आदि, यह स्मृति में एक नई डेटा सुरक्षा कुंजी बनाता है, इसलिए आपके उपयोगकर्ता की सत्र कुंजी अमान्य हैं। तो तुम सब करने की जरूरत है जोड़ने Startup.cs के लिए निम्न है:

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

जानने के लिए कैसे ठीक से इस की स्थापना की और जहां डेटा संरक्षण कुंजी (फाइल सिस्टम को बचाने के लिए के विभिन्न विकल्पों के लिए प्रलेखन का प्रयोग करें, redis , रजिस्ट्री, आदि)। आप asp.net में web.config की मशीन कुंजी के प्रतिस्थापन के रूप में डेटा सुरक्षा कुंजी के बारे में सोच सकते हैं।

चूंकि आपने बताया है कि आप Azure का उपयोग कर रहे हैं, तो आप इस पैकेज का उपयोग Microsoft.AspNetCore.DataProtection.AzureStorage कुंजी को सहेजने के लिए कर सकते हैं ताकि यह बनी रहे। तो आप use this example of how to use Azure Storage कर सकते थे।

+0

तो मेरा आवेदन पूल हर 30 मिनट में पुनर्नवीनीकरण कर रहा है, और उस समय के साथ समन्वयित किया गया है जब मैंने पिछली बार लॉग इन किया है? यह मुझे समझ में नहीं आता है। – ganders

+0

शायद यह पुनर्नवीनीकरण नहीं किया जा रहा है कि अक्सर, नहीं। लेकिन AspNetCore प्रलेखन का उल्लेख है कि डेटा सुरक्षा कुंजी डिफ़ॉल्ट रूप से स्मृति में उत्पन्न होती है - और सत्र और पहचान कुकी डेटा (साथ ही ValidateAntiForgery टोकन एक्शन फ़िल्टर) की रक्षा करती है जो उपयोगकर्ता के लिए मान्य नहीं होगी यदि यह डेटा सुरक्षा कुंजी परिवर्तन। – truemedia

+0

मैंने अभी देखा [डेटा संरक्षण के लिए डिफ़ॉल्ट सेटिंग्स] (https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/default-settings#data-protection-default-settings) Azure पर आपको स्थापित करने में वास्तव में काफी अच्छा है। आप बस कोड जोड़ सकते हैं, 'सेवाएं। AddDataProtection();' और आपको ऊपर और चलना चाहिए। Azure स्वचालित रूप से आपके लिए चाबियाँ जारी रखेगा। साथ ही, आईआईएस का उपयोग करने वाले किसी भी व्यक्ति के लिए, वे 'PersistKeysToFileSystem' विकल्प' की आवश्यकता के बिना एक मशीन पर भी अच्छी तरह से काम करेंगे, क्योंकि डिफ़ॉल्ट सेटिंग्स इसे अच्छी तरह से सेट करती हैं, जैसा कि दस्तावेज़ों में दिखाया गया है। – truemedia

संबंधित मुद्दे