web-dev-qa-db-fra.com

Connexion à l'authentification ASP.NET et déconnexion avec le bouton Précédent du navigateur

Je recherche une solution pour l'utilisateur. Utilisez le bouton Précédent du navigateur pour naviguer vers la page précédente une fois que vous êtes déconnecté.

J'ai une application Web construite en asp.net et utilisant un fournisseur d'adhésion personnalisé pour l'authentification et l'autorisation. Tout fonctionne correctement, sauf lorsque l'utilisateur clique sur le lien de déconnexion pour se déconnecter de l'application et est redirigé vers une page de garde par défaut. Si vous cliquez sur le bouton RETOUR de son navigateur, il reviendra à son emplacement précédent et les données seront toujours visibles. 

Bien sûr, ils ne peuvent rien faire sur cette page, cliquez sur n'importe quel lien pour qu'ils soient redirigés vers une page de connexion. Cependant, l'affichage de ces informations est une source de confusion pour les utilisateurs.

je me demande simplement s'il est possible de vider l'historique du navigateur afin que l'utilisateur ne puisse pas revenir en arrière, ou lorsqu'il clique sur le bouton Précédent et le redirige vers la page de connexion.

merci

28
Eatdoku

S'inquiéter de l'historique du navigateur et du bouton Précédent vous donnera des maux de tête et des verrues génitales. Il existe des installations intégrées pour traiter ce problème.

Votre lien/bouton de déconnexion doit pointer vers une page contenant ce code, ainsi que tout ce que vous voulez.

[vb.net]

Imports System.Web.Security

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
 Handles MyBase.Load
    Session.Abandon()
    FormsAuthentication.SignOut()
End Sub

[c #]

using System.Web.Security;

private void Page_Load(object sender, System.EventArgs e)
{
    // Put user code to initialize the page here
    Session.Abandon();
    FormsAuthentication.SignOut();
}

Le code provient de cette page et est valide, mais la page est dure pour les yeux.

Vous pouvez trouver une bonne question/réponse concernant le comportement du backbutton ici .

Mettre à jour:

suite à la conversation que j'ai avec Matthew, la désactivation de la mise en cache sur des pages individuelles sensibles ou volatiles peut être effectuée à l'aide d'un code tel que:

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();

Je suis curieux de savoir si cela fonctionne pour vous comme pour moi.

23
Sky Sanders

Vous pouvez utiliser javascript pour désactiver le bouton Précédent (généralement en envoyant l'utilisateur vers une page qui le transfère vers une autre page, de sorte que cliquer en arrière vous renvoie de nouveau). Un utilisateur persistant peut toujours revenir 2 pas en arrière dans l'historique et parcourir la boucle.

Cette page est dans le cache du navigateur. Vous pouvez demander au navigateur de ne rien mettre en cache, mais cela gâchera les performances, parfois de façon dramatique. Je ne le recommanderais donc pas.

3
MatthewMartin

Ce code est très utile 

Response.Cache.SetCacheability(HttpCacheability.NoCache);

Ne mettez ce code que sur l'événement load, sur la page principale au cas où, mais cela ne fonctionne que pour IE, pour IE et Firefox

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
1
Michrl Castle

Ta Réponse

Une solution consiste à ajouter le code javascript suivant à la section de la page logout.aspx:

<script type="text/javascript">
 window.history.forward(1);
</script>

Ce code javascript permettra à l'utilisateur de revenir si l'utilisateur accède à la page de déconnexion en appuyant sur le bouton Précédent.

Si vous devez vous assurer que l'utilisateur n'a aucun moyen de revenir aux pages après leur déconnexion, vous devez demander au navigateur de ne mettre en cache aucune des pages en incluant un code similaire au suivant sur chaque page:

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoStore(); 
1
Tejas

La meilleure solution consiste à placer le code suivant dans votre page maître. Cela évite la mise en cache des pages et empêche l'utilisateur d'y accéder après la déconnexion.

P.S: Les codes suivants proviennent de sources diverses. Posté ici pour que toute personne à la recherche d'une solution puisse la trouver utile 

Master.cs

protected void Page_Load(object sender, EventArgs e)
    {
        Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetNoStore(); 

    }

Master.aspx

<a href="logout.aspx">Logout</span></a>

logout.cs

protected void Timer1_Tick(object sender, EventArgs e)
        {
            Session.Clear();
            Session.Abandon();


 Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetNoStore();

        try
        {
            Session.Abandon();
            FormsAuthentication.SignOut();
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.Buffer = true;
            Response.ExpiresAbsolute = DateTime.Now.AddDays(-1d);
            Response.Expires = -1000;
            Response.CacheControl = "no-cache";
            //Response.Redirect("login.aspx", true);
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
        Response.Redirect("Signin.aspx");
    }

logout.aspx

<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" Text="Loggin Out Please Wait" runat="server" />
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="Timer1_Tick">
            </asp:Timer>
        </ContentTemplate>
    </asp:UpdatePanel>
</div>

</div>
</form>
0
S.Mohamed

Vous pouvez essayer d'utiliser la propriété HttpResponse.Cache si cela peut vous aider:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;

if (Response.Cache.VaryByParams["Category"])
{
//…
}

Sinon, vous pouvez bloquer la mise en cache de la page avec HttpResponse.CacheControl, mais son utilisation est déconseillée au profit de la propriété Cache ci-dessus:

Response.CacheControl = “No-Cache”;

OU vous pouvez vraiment devenir fou et tout faire à la main:

Response.ClearHeaders();
Response.AppendHeader(“Cache-Control”, “no-cache”); //HTTP 1.1
Response.AppendHeader(“Cache-Control”, “private”); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “no-store”); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “must-revalidate”); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “max-stale=0″); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “post-check=0″); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “pre-check=0″); // HTTP 1.1
Response.AppendHeader(“Pragma”, “no-cache”); // HTTP 1.1
Response.AppendHeader(“Keep-Alive”, “timeout=3, max=993″); // HTTP 1.1
Response.AppendHeader(“Expires”, “Mon, 26 Jul 1997 05:00:00 GMT”); // HTTP 1.1

Référence

0
vic