5

Ich versuche, ein Webanwendungsprojekt zu implementieren, bei dem meine Webseiten den Server auf das Ablaufdatum/die Zeit für das Authentifizierungsticket mithilfe von AJAX überprüfen können.Überprüfen Sie den Ablauf des Authentifizierungstickets, ohne es zu beeinflussen

Ich verwende Formularauthentifizierung mit gleitendem Expiration.

Das Problem, über das ich stolpere, ist, dass ich nicht herausfinden kann, wie man den Wert überprüft, ohne ihn zurückzusetzen. Ich habe eine einfache Seite - CheckExpiration.aspx - unterhalb der Code hinter ist:

private class AjaxResponse 
    { 
    public bool success; 
    public string message; 
    public string expirationDateTime; 
    public string secondsRemaining; 
    public string issueDate; 
    } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
    AjaxResponse ar = new AjaxResponse(); 
    JavaScriptSerializer js = new JavaScriptSerializer(); 

    if (HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity; 
     string expiration = id.Ticket.Expiration.ToString(); 

     TimeSpan timeRemaining = id.Ticket.Expiration - DateTime.Now; 

     ar.success = true; 
     ar.expirationDateTime = expiration; 
     ar.issueDate = id.Ticket.IssueDate.ToString(); 
     ar.secondsRemaining = timeRemaining.Minutes.ToString() + ":" + timeRemaining.Seconds.ToString(); 
    } 
    else 
    { 
     ar.success = false; 
     ar.message = "User not authenticated"; 
    } 

    string output = js.Serialize(ar); 
    Response.Write(js.Serialize(ar)); 

    } 

Ich nenne diese Seite von der Master-Seite in meiner Anwendung Ajax jede Sekunde. Nach Ablauf der Hälfte des Ablaufs der Authentifizierung wird der Ablauf zurückgesetzt.

Wie verhindere ich dieses Verhalten? Gibt es irgendetwas, was ich im Header der Anfrage tun kann?

+0

Check das ist es etwas ähnliches oder Ihr Problem ist diff ... http: //www.dotnetmonster.com/Uwe/Forum.aspx/asp-net-security/2316/problem-with-slidingExpiration – Scorpio

+0

Ich denke, dass dieser Beitrag, zu dem Sie verlinken, Probleme mit dem Standardverhalten von .net hat. Ich interessiere mich nicht für dieses Verhalten, denn wenn Sie im Leerlauf bleiben, werden Sie nicht wissen, dass Sie auf Serverebene ausgeloggt sind, bis Sie versuchen, etwas zu tun. Ich versuche, etwas benutzerfreundlicher zu machen, wo Sie darüber informiert werden, dass Sie gerade ausgeloggt werden. Ich möchte mich auch nicht nur auf einen Javascript-Timer verlassen, der beim Eingeben einer Seite eingestellt wird, weil die Authentifizierung von einer anderen Registerkarte aktualisiert werden könnte. –

Antwort

0

Warum speichern Sie den Ablauf nicht als eine Sitzungsvariable, die Sie selbst berechnen? Sie müssen nur einmal den Wert von id.Ticket.Expiration abrufen. Rufen Sie dann bei jedem Aufruf den Wert vom Server ab, inkrementieren Sie ihn entsprechend und speichern Sie ihn auf dem Server.

http://msdn.microsoft.com/en-us/library/ms178581%28v=vs.85%29.aspx

Pseudocode:

if(!Session.KeyExists("Expiration")) 
{ 
    Session["Expiration"] = id.Ticket.Expiration; 
} 

Session["TimeRemaining"] = Session["Expiration"] - DateTime.Now; 

// get all ajaxy here 
0

Setzen Sie Ihre CheckExpiration.aspx Seite in ihrer eigenen Anwendung und dies unter Hauptanwendung als virtuelles Verzeichnis bereitstellen. Konfigurieren Sie in diesem virtuellen Verzeichnis slidingExpiration = false. Ihr Code funktioniert so wie er ist, aber er wird das Ticket nicht neu generieren, wenn es die Hälfte der Zeit bis zum Ablauf erreicht.

Hier ist, was ich in einem schnellen lokalen Projekt habe zu überprüfen, ob es funktioniert:

  1. Erstellen eine neue Web-Anwendung AuthTest4 und konfigurierte es in Pfad/AuthTest4
  2. in IIS Went lokalen IIS-Server zu verwenden und Die Maschinenschlüsseleinstellung für/AuthTest4 wurde geändert, um alle AutoGenerate/Isolate-Optionen zu deaktivieren und einen eigenen MachineKey zu generieren.
  3. eine leere Web-Anwendung ExpCheck und setzen Sie Ihren CheckExpiration.aspx Code darin
  4. projektierte ExpCheck Web-Anwendung erstellt, um die web.config von ExpCheck Anwendung lokale IIS in dem virtuellen Verzeichnis zu verwenden/AuthTest4/ExpCheck
  5. geändert zu haben Nur der unten gezeigte Abschnitt

ExpCheck web.config. Alle anderen Sicherheitseinstellungen werden vom übergeordneten virtuellen Verzeichnis heruntergefahren.

<system.web> 
    <authentication mode="Forms"> 
    <forms slidingExpiration="false" /> 
    </authentication> 
</system.web>