Dies ist die Login-Funktion (nachdem ich den Benutzernamen und das Passwort zu validieren, ich Benutzerdaten in „user“ Variable und Call-Log-Funktion laden:IsAuthenticated ist falsch! seltsame Verhalten + Bewertung Frage
public static void Login(IUser user)
{
HttpResponse Response = HttpContext.Current.Response;
HttpRequest Request = HttpContext.Current.Request;
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
user.UserId.ToString(), DateTime.Now, DateTime.Now.AddHours(12), false,
UserResolver.Serialize(user));
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,
FormsAuthentication.Encrypt(ticket));
cookie.Path = FormsAuthentication.FormsCookiePath;
Response.Cookies.Add(cookie);
string redirectUrl = user.HomePage;
Response.Redirect(redirectUrl, true);
}
UserResolver ist die folgende Klasse:
public class UserResolver
{
public static IUser Current
{
get
{
IUser user = null;
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
FormsAuthenticationTicket ticket = id.Ticket;
user = Desrialize(ticket.UserData);
}
return user;
}
}
public static string Serialize(IUser user)
{
StringBuilder data = new StringBuilder();
StringWriter w = new StringWriter(data);
string type = user.GetType().ToString();
//w.Write(type.Length);
w.WriteLine(user.GetType().ToString());
StringBuilder userData = new StringBuilder();
XmlSerializer serializer = new XmlSerializer(user.GetType());
serializer.Serialize(new StringWriter(userData), user);
w.Write(userData.ToString());
w.Close();
return data.ToString();
}
public static IUser Desrialize(string data)
{
StringReader r = new StringReader(data);
string typeStr = r.ReadLine();
Type type=Type.GetType(typeStr);
string userData = r.ReadToEnd();
XmlSerializer serializer = new XmlSerializer(type);
return (IUser)serializer.Deserialize(new StringReader(userData));
}
}
Und die global.asax implementiert die folgenden:
void Application_PostAuthenticateRequest(Object sender, EventArgs e)
{
IPrincipal p = HttpContext.Current.User;
if (p.Identity.IsAuthenticated)
{
IUser user = UserResolver.Current;
Role[] roles = user.GetUserRoles();
HttpContext.Current.User = Thread.CurrentPrincipal =
new GenericPrincipal(p.Identity, Role.ToString(roles));
}
}
Erste Frage: Bin ich es richtig?
Zweite Frage - seltsame Sache! Die Benutzervariable, die ich an die Anmeldung übergebe, hat 4 Mitglieder: Benutzername, Passwort, Name, Id. Wenn UserResolver.Current ausgeführt wurde, habe ich die Benutzerinstanz erhalten. Ich entschied, die Benutzerstruktur zu ändern - ich füge ein Array von Warehouse-Objekt hinzu. Seit dieser Zeit, als UserResolver.Current (nach der Anmeldung) ausgeführt wurde, war HttpContext.Current.User.Identity.IsAuthenticated falsch und ich konnte die Benutzerdaten nicht abrufen. Wenn ich das Warehouse [] aus der Benutzerstruktur entfernt habe, ist es wieder in Ordnung und HttpContext.Current.User.Identity.IsAuthenticated wird nach der Anmeldung wahr.
Was ist der Grund für dieses seltsame Verhalten?
Ich kann keine Entschlüsselung finden ..Warum funktioniert das jetzt und wo sollte ich das Decrypt platzieren? .. Danke – Naor
Mach dir keine Sorgen über die Entschlüsselung - ich habe ein wenig nachgedacht und es sieht so aus, als ob es automatisch vom FormsAuthenticationModule erledigt wird. – smartcaveman
Sie haben mir sicherlich geholfen, obwohl ich nicht ausführlich darüber recherchiert habe. Ich werde dir die Belohnung geben. Wenn ich irgendwelche Fragen habe, werde ich sie hier fragen. Vielen Dank. – Naor