2017-10-20 40 views
1

J'ai la configuration suivante J'ai LockOut.DefaultLockoutTimeSpan mis à 2 hours et ApplicationCookie.ExpireTimeSpan mis à one day. Mais si l'application est inactive pendant 2 heures, elle ne redirige pas l'utilisateur vers login page. Dans le View ci-dessous, j'utilise Ajax où un événement de clic d'un onglet dans une tabulation obtient un ID de l'onglet et le passe à une méthode d'action appelant. Mais j'ai remarqué que si je laisse l'application inactive pendant 2 heures et que je clique sur l'onglet, la valeur d'id est nulle et donc, comme prévu, la méthode d'action échoue et le message d'alerte dans le bloc error de la méthode Ajax est affiché. Question: Comment puis-je rediriger l'application vers la page de connexion lorsque la session de connexion expire? Évidemment, il me manque quelque chose dans le code ci-dessous. J'utilise ASP.NET Identity-3 pour l'authentification.ASP.NET Core ne redirige pas vers la page de connexion après expiration de la session

MISE À JOUR:

Ce qui se passe est que j'ai trois variables de session importants qui stockent des valeurs qui sont utilisées à travers les pages. Et ces valeurs se perdent toutes les 15-20 minutes environ. Et donc l'application lance un message d'erreur dans le dialogue d'alerte (...) des blocs d'erreur du code Ajax. J'ai donc pensé que cela avait quelque chose à voir avec le cookie d'authentification expirant plus tôt. Mais il semble que la question est plus liée à l'expiration de la session plus tôt que j'en ai besoin.

StartUp.cs

... 
public void ConfigureServices(IServiceCollection services) 
{ 
    ... 

    // Add framework services. 
    services.AddDbContext<ApplicationDbContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

    services.AddIdentity<ApplicationUser, ApplicationRole>() 
     .AddEntityFrameworkStores<ApplicationDbContext>() 
     .AddDefaultTokenProviders(); 

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

    services.Configure<IdentityOptions>(options => { 
     // Lockout settings 
     options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(120); //The amount of time in minutes a user is locked out when a lockout occurs 

     // Cookie settings 
     options.Cookies.ApplicationCookie.ExpireTimeSpan = TimeSpan.FromDays(1); //Controls how much time the authentication ticket stored in the cookie will remain valid from the point it is created. Defaults to 14 days. 
     options.Cookies.ApplicationCookie.LoginPath = "/Account/LogIn"; //When a user is unauthorized, they will be redirected to this path to login. Defaults to /Account/Login. 
     options.Cookies.ApplicationCookie.LogoutPath = "/Account/LogOut"; 
    }); 

    // Add application services. 
    services.AddTransient<IEmailSender, AuthMessageSender>(); 
    services.AddTransient<ISmsSender, AuthMessageSender>(); 
} 
... 

MyView:

<html> 
... 
<div>Tabstrib here with tab1, tab2</div> 
... 
@section scripts 
{ 
    @{ await Html.RenderPartialAsync("_ValidationScriptsPartial"); } 
    <script> 
     $(document).ready(function() { 
      ... 

     $('#myTabstripID li').click(function() { 
      var li_id = $(this).attr("id"); 
      $.ajax({ 
       url: '@Url.Action("ActionName", "ContrlName")', 
       data: { calledFrom: li_id }, 
       contentType: 'application/json', 
       dataType: 'html', 
       type: 'GET', 
       cache: false, 
       success: function (data) { 
        if (li_id == 'Tab1') 
         $('#menuAP').html(data); 
        else if (li_id == 'Tab2') 
         $('#menuUP').html(data); 
       }, 
       error: function (jqXHR, textStatus) { 
        alert('Error occurred'); 
       } 
      }); 
     }); 
    ... 
} 
+0

Lorsqu'un appel Ajax frappe un site Web alors que ce site Web nécessite une réauthentification, ne devrait-il pas renvoyer une réponse 401 (Autorisation requise) au lieu de rediriger vers la page de connexion? Je pense que c'est la nature de l'API Web. –

+0

@Afshar Je n'utilise pas l'API Web - C'est une application web. Mais je vois votre point. Le problème peut sembler être lié à l'expiration des variables de session. J'ai ajouté une section ** UPDATE ** à cet article. Auriez-vous une idée sur la façon de résoudre le problème lié à la variable de session? – nam

Répondre

1

Le Lockout.DefautLockoutTimeSpan est censé être combien de temps l'utilisateur doit être verrouillé avant (s) il peut réauthentifier encore une fois, si Lockout est activé dans l'identité ASP.NET. Ce n'est pas le laps de temps pour combien de temps avant la fin de la session.

Pour activer le middleware de session, vous pouvez utiliser le package Microsoft.AspNetCore.Session.

public class Startup 
{ 
    public void ConfigureServices(IServiceCollection services) 
    { 
     ... 
     services.AddSession(options => 
     { 
      options.IdleTimeout = TimeSpan.FromSeconds(60); 
      options.Cookie.HttpOnly = true; 
     }); 
     ... 
    } 

    public void Configure(IApplicationBuilder app) 
    { 
     app.UseSession(); 
     ... 
    } 
} 

Mais je pensais IdleTimeout est utilisé par le serveur pour déterminer la durée d'une session peut être inactif avant son contenu sont abandonnés. Je pensais que la session est utilisée pour transmettre des données de page en page. Donc, si le IdleTimeout se produit, toutes les données stockées dans la session auraient disparu. Mais en lisant votre question, je pensais que vous vouliez simplement que le site invite l'utilisateur lorsqu'il est sur le point d'être déconnecté pour cause d'inactivité. Si l'application peut se déconnecter automatiquement de l'utilisateur en fonction de l'intervalle de temps, il ne sera pas convivial, car l'utilisateur pourrait être au milieu de quelque chose.

Si vous souhaitez effectuer une action après une période de temps, c'est-à-dire, aucune activité sur la page après 2 heures, il existe des plugins jQuery pour vous aider à détecter le délai d'attente de session. Malheureusement, j'ai oublié le nom de celui que j'ai utilisé auparavant. Je suis sûr que vous pouvez facilement google un, comme https://plugins.jquery.com/sessionTimeout/

+0

Bon point. Alors, comment puis-je régler l'heure, par exemple, 2 heures avant que l'application se déconnecte de l'utilisateur? – nam

+0

J'ai utilisé le plugin jQuery timeout, où vous pouvez définir l'intervalle de temps de sorte qu'après l'expiration du délai, une action soit effectuée. Vous pouvez définir cette action pour déconnecter l'utilisateur? Encore une fois, j'avais utilisé une bibliothèque pour faire exactement la même chose avant mais j'ai juste oublié le nom. –

+0

Mais je pense que ASP.NET Core a quelques paramètres de configuration pour définir cette période de temps, correct? – nam