2015-04-23 8 views
7

Mein Projekt hat ein Problem bei der Erneuerung der Formularauthentifizierungssitzung aufgrund von widersprüchlichen Formularauthentifizierungs-Cookies.Formularauthentifizierungserneuerung Problem mit benutzerdefinierter Formularauthentifizierung

Detaillierte Beschreibung:

Nachdem ein Benutzer angemeldet ist, bildet ein Auth-Cookie (FACookieA) erstellt, und sie/er authentifiziert ist. Wenn es jedoch darum geht, den Cookie zu erneuern, wird ein zweiter Authentifizierungs-Cookie (FACookieB) erstellt, und FACookieA wird nicht erneuert. Der Benutzer wird nach Ablauf der Ablaufzeit in FACookieA zur Anmeldeseite auf Seitenanforderung umgeleitet, auch wenn es vor Ablauf der Ablaufzeit in FACookieB ist.

generiert Cookies:

Bitte beachten Sie, dass beide Cookies den gleichen Namen haben.

FACookieA: ""

name: FormsAuth 
domain: .formsauth.com 

bitte die beachten vorgehängten von .NET ist die "formsauth.com" von Formularauthentifizierung Ticket Abschnitt

FACookieB:

name: FormsAuth 
host: a.formsauth.com 

beachten Sie bitte die Cookie verwendet "host", nicht die Domäne und „ein. formsauth.com "basiert auf der aktuellen Anfrage-URL-Domain.

url Projekt getestet:

a.formsauth.com 

Web.config:

<forms loginUrl="~/Account/Login.aspx" name="FormsAuth"/> 

-Code

public partial class Account_Login : System.Web.UI.Page 
{ 
    protected void LoginButton_Click(object sender, EventArgs e) 
    { 
     if (Membership.ValidateUser(LoginUser.UserName.Trim(), LoginUser.Password.Trim())) 
     { 
      FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
       1, 
       "username", 
       DateTime.Now, 
       DateTime.Now.AddMinutes(2), 
       false, 
       string.Empty 
      ); 

      string encryptedTicket = FormsAuthentication.Encrypt(ticket); 
      HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
      cookie.Domain = "formsauth.com"; 
      cookie.Path = FormsAuthentication.FormsCookiePath; 
      Response.Cookies.Remove(cookie.Name); 
      Response.Cookies.Add(cookie); 
      Response.Redirect("~/Account/ChangePassword.aspx"); //authenticated area 

     }else 
     { 
      Response.Write("Invalid UserID and Password"); 
     } 
    } 
} 

Fragen:

1) Wie generiere ich eine Formsauth Cookie, so dass Benutzer Formulare Auth Session erneuern können und nicht abgemeldet werden?

Überlegungen:

1) Das Projekt muss mehrere Sprachen, mit möglichen Domain-Formate unten unterstützen:

a.formsauth.com 
a.en.formsauth.com 
a.us.formsauth.com 

und

b.formsauth.com 
b.en.formsauth.com 
b.us.formsauth.com 

So kann ich nicht setzen Sie die Domain Attribut des Forms-Elements deklarativ. Da zwei Gruppen von Domains keine Cookies teilen können, ist das Teilen von Cookies innerhalb einer Gruppe erlaubt. Das ist die gleiche Codebasis für verschiedene Apps mit unterschiedlichen Domains. Aber eine Gruppe von Domains kann Cookies teilen.

2) Das integrierte Standard-FormsAuthenticationModule erneuert den Benutzersitzungscookie, weshalb ich keine Kontrolle über die Domäne im Cookie habe. Beachten Sie, dass FormsAuthenticationTicket zum Erstellen von Cookies bei der Verwendung verwendet wird, wie oben gezeigt.

Irgendeine Idee?

+0

Bitte senden Sie den Code, der das Cookie aktualisiert – Mike

+0

haben Sie 'Cookie gesetzt. Domain = "formsauth.com"; 'wenn Sie den Cookie aktualisieren? –

+0

Ich kann mich nicht mehr so ​​gut an ASP.NET Forms Auth erinnern, also funktioniert das vielleicht gar nicht mit Ihrer Implementierung, aber haben Sie versucht, 'slidingExpiration =" true "cookieless =" UseCookies "timeout =" x "' in ' hinzuzufügen 'in deiner web.config? "x" ist die Zeit in Minuten der Inaktivität, bevor sich der Benutzer erneut anmelden muss. –

Antwort

0

Die Logik des Codes ist nicht ganz klar, nicht klar, warum Sie Cookies zu ersetzen versuchen.)

aber ich, dass die Umleitung vor geschieht das neue Cookie registriert wurde, erraten werde.

 Response.Cookies.Remove(cookie.Name); 

hinzufügen hier Code zu überprüfen, ob Cookies entfernt wird, bevor Sie die anderen

 Response.Cookies.Add(cookie); 

Code hinzufügen Hier hinzuzufügen versuchen, das Cookie, um sicherzustellen, durch den Browser registriert wurde (?), Bevor Sie redirect

+0

Hallo, könnten Sie bitte näher darauf eingehen und ein Codebeispiel? – Pingpong

0

Sie können Host- und Domain-Cookies nicht mit demselben Namen kombinieren. Um dies zu ermöglichen, müssen alle Cookies in der Top-Level-Domain gesetzt werden.

0

Versuchen Sie, folgenden Code zu verwenden.Ich hoffe, dass Ihnen helfen wird.

if (Membership.ValidateUser (LoginUser.UserName.Trim(), LoginUser.Password.Trim())) {

   int timeout = model.RememberMe ? 525600 : 30; 
       //DateTime timeout = model.RememberMe ? 525600 : 30; 
       string userData = JsonConvert.SerializeObject(model); 
       FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, login[0].adminUserName, DateTime.Now, DateTime.Now.AddMinutes(525600), false, userData); 

       string enTicket = FormsAuthentication.Encrypt(authTicket); 
       HttpCookie authcookie = new HttpCookie(FormsAuthentication.FormsCookieName, enTicket); 
       Response.Cookies.Add(authcookie); 



      return Response.Redirect("~/Account/ChangePassword.aspx"); //authenticated area 


      } 
      else 
      { 
       Response.Write("Invalid UserID and Password"); 
      } 
Verwandte Themen