Check Remember su login utente

sabato 29 maggio 2010 - 15.05

serrax Profilo | Junior Member

salve a tutti, sto creando un login utente utilizzando le Session....
Volendo inserire un check per fare in modo che vengano memorizzati i dati inseriti sto provando a fare così:

public void check (object sender, EventArgs e)
{
CheckBox rm = (CheckBox)LoginCtrl.FindControl("RememberMe");
if (!rm.Checked)
{

HttpCookie cookie = new HttpCookie("Cookiename");
cookie.Values.Add("Email", email.Text);
cookie.Values.Add("Password", pass.Text);
DateTime dtExpiry = DateTime.Now.AddDays(10);
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = dtExpiry;
}
}

solo che se spunto il check mi da errore sull'if :
Riferimento a un oggetto non impostato su un'istanza di oggetto.

come faccio??

TOPOAMORE Profilo | Expert

Ciao,

ma perche non fai riferimento direttamente al check presente nel form???


__.__.__.__.__.__

ASP 2.0 - VB 2008

serrax Profilo | Junior Member

ciao,
si non lo faccio perchè non utilizzo il createuserwizard del membershipprovider, ma utilizzo la Session (per motivi che non sto ora ad elencare...)
quindi volevo inserire il check per memorizzare i dati inseriti, e avevo pensato ai cookie....

qualche idea???

Gluck74 Profilo | Guru

Probabilmente la function check viene chiamata in un momento sbagliato.
L'errore che hai (ne sono sicuro al 99%), è dato dal fatto che non hai il checkBox a disposizione:

CheckBox rm = (CheckBox)LoginCtrl.FindControl("RememberMe"); if (rm != null) { if (!rm.Checked) ... ... } else //qualcosa che non va. Forse l'evento sbagliato


Verifica se stai utilizzando la funzione check al momento giusto nel ciclo di vita della pagina

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

serrax Profilo | Junior Member

ciao allora
se per "non avere il Check a disposizione" intendi di avere il check control nella pagina asp.net, non è così perchè nella pagina ho questo:

<asp:CheckBox ID="LoginCtrl" OnCheckedChanged="check" runat="server" Text="Ricordami" />

tra l'altro ho messo la classe dopo la verifica dell'e-mail e della password prima del pulsante.....

onestamente non so cosa sbaglio!!!

Gluck74 Profilo | Guru

onestamente non ho capito una mazza di quello che hai detto......

per "non hai a disposizione" il controllo, intendo da codice nel momento che lo utilizzi, non da aspx.
Come puoi vedere dal codice che ti ho mandato, dopo aver "letto" l'oggetto "rm", e prima di qualsiasi altra istruzione,
ho aggiunto
if(rm != null)

comunque.....

se la funzione Check è attaccata all'evento OnCheckedChanged del checkbox, hai messo anche l'autopostback? o richiami la funzione chack da un'altra parte?


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

TOPOAMORE Profilo | Expert

> public void check (object sender, EventArgs e)
> {
>CheckBox rm = (CheckBox)LoginCtrl.FindControl("RememberMe");
> if (!rm.Checked)
> {
>
>HttpCookie cookie = new HttpCookie("Cookiename");
>cookie.Values.Add("Email", email.Text);
>cookie.Values.Add("Password", pass.Text);
>DateTime dtExpiry = DateTime.Now.AddDays(10);
>Response.Cookies[FormsAuthentication.FormsCookieName].Expires
>= dtExpiry;
> }
>}
allora scusa un secondo ma se tu hai nella pagina

><asp:CheckBox ID="LoginCtrl" OnCheckedChanged="check" runat="server" Text="Ricordami" />
perche non modifichi il codice cosi: (lo scrivo in vb non essendo pratico di c)

if loginctrl.checked=true then end if

in c se non erro dovrebbe essere

if (this.loginctrl.checked==true){ }

se non ho capito nulla dimmelo.

Un saluto

__.__.__.__.__.__

ASP 2.0 - VB 2008

serrax Profilo | Junior Member

ciao,
topo amore in quel modo,mi sa che mi complico un pochino....

tra l'altro si, dovete scusarmi, ho fatto un dialogo tra me e me sapendo cosa c'è dietro....

il postback non lo'ho messo da nessuna parte....

tra l'altro ora ho inserito il codice come mi avevi tu Gluck... e ora non mi da più l'errore, però se scrivo il nome utente nella textbox della password, non mi esce la password... ho saltato qualcosa? o devo inserire il postback (e dove?) ??

grazie e scusate

TOPOAMORE Profilo | Expert

Non so perche dici che ti compliche le cose....

fai solamente riferimento al check presente in form....

io proverei e vedrei che esce.......

__.__.__.__.__.__

ASP 2.0 - VB 2008

Gluck74 Profilo | Guru

Ciao serrax.......
ci mancano dei pezzi....... non è che ci stai dicendo le cose a rate come la findomestic?
scherzi a parte......

Ho perso il filo e non ho capito come è composta la tua pagina.
A regola dovresti avere un textbox per username, un pwdbox per la password, un checkbox per il "ricordami", ed un pulsante per il login.

sull'evento click del pulsante gestisci sia il login, sia il controllo del checkbox selezionato o no.
Questo se hai una form custom creata da te.

se usi la form di login già pronta, sposti la gestione sull'evento "LoggingIn" del controllo, prelevando i dati in questa maniera:

string pwd = Login1.Password; string user = Login1.UserName; bool rm = Login1.RememberMeSet;

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

serrax Profilo | Junior Member

ciao,
si in pratica ho un form creato da me....
la differenza è che non gestico l'evento del check dentro il pulsante, ma lo richiamo separatamente....
Ho provato a metterlo all'interno del pulsante, ma non funziona lo stesso...
forse conviene che vi allego quello che ho come codice per il pulsante...

public void submit(object sender, EventArgs e)
{
CheckBox rm = (CheckBox)LoginCtrl.FindControl("RememberMe");
if (rm != null)
{
if (!rm.Checked)
{

HttpCookie cookie = new HttpCookie("Cookiename");
cookie.Values.Add("Email", email.Text);
cookie.Values.Add("Password", pass.Text);
DateTime dtExpiry = DateTime.Now.AddDays(10);
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = dtExpiry;
}
}
string ConnStrS = "Server=localhost;Database=eshop;uid=root;password=giovanni;";


MySqlConnection con = new MySqlConnection(ConnStrS);
{
MySqlCommand query = new MySqlCommand("SELECT ruolo FROM `user` WHERE email='" + email.Text + "' ", con);
con.Open();
int rows = Convert.ToInt32(query.ExecuteScalar());
con.Close();
if (rows == 0)
{

string Email = email.Text;
string Password = pass.Text;
if (CheckEmail(Email) == false)
{
lblResult.Text = "Email errata";

}
else if (CheckPassword(Password) == false)
{
lblResult.Text = "Password errata";
}
else
{
con.Open();
string SQL = "SELECT * FROM `user` WHERE email='" + email.Text + "' and password='" + pass.Text + "'";
MySqlCommand reader_command = new MySqlCommand(SQL, con);
reader_command.Parameters.AddWithValue("@email", email.Text);
reader_command.Parameters.AddWithValue("@pass", pass.Text);
MySqlDataReader reader_exec = reader_command.ExecuteReader();

if (reader_exec.Read())
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, // Ticket version
email.Text,// Username associated with ticket
DateTime.Now, // Date/time issued
DateTime.Now.AddMinutes(30), // Date/time to expire
true, // "true" for a persistent user cookie
reader_exec["ruolo"].ToString(), // User-data, in this case the roles
FormsAuthentication.FormsCookiePath);// Path cookie valid for

// Encrypt the cookie using the machine key for secure transport
string hash = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(
FormsAuthentication.FormsCookieName, // Name of auth cookie
hash); // Hashed ticket

// Set the cookie's expiration time to the tickets expiration time
if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;

// Add the cookie to the list for outgoing response
Response.Cookies.Add(cookie);

Session["userlogin"] = true;
Session["userid"] = reader_exec["userid"].ToString();
Session["UserName"] = reader_exec["username"].ToString();
Session["Email"] = reader_exec["email"].ToString();
Session["Ruolo"] = reader_exec["ruolo"].ToString();


Response.Redirect("~/user/user.aspx?email= " + email.Text + "", false);
}
else
{

lblResult.Text = "Username / password incorrect. Please try again.";
lblResult.Visible = true;
}

reader_exec.Close();
}
}
else if (rows == 1)
{
string Email = email.Text;
string Password = pass.Text;
if (CheckEmail(Email) == false)
{
lblResult.Text = "Email errata";

}
else if (CheckPassword(Password) == false)
{
lblResult.Text = "Password errata";
}
else
{
con.Open();
string SQL = "SELECT * FROM `user` WHERE email='" + email.Text + "' and password='" + pass.Text + "'";
MySqlCommand reader_command = new MySqlCommand(SQL, con);
reader_command.Parameters.AddWithValue("@email", email.Text);
reader_command.Parameters.AddWithValue("@pass", pass.Text);
MySqlDataReader reader_exec = reader_command.ExecuteReader();
if (reader_exec.Read())
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, // Ticket version
email.Text, // Username associated with ticket
DateTime.Now, // Date/time issued
DateTime.Now.AddMinutes(30), // Date/time to expire
true, // "true" for a persistent user cookie
reader_exec["ruolo"].ToString(), // User-data, in this case the roles
FormsAuthentication.FormsCookiePath);// Path cookie valid for

// Encrypt the cookie using the machine key for secure transport
string hash = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(
FormsAuthentication.FormsCookieName, // Name of auth cookie
hash); // Hashed ticket

// Set the cookie's expiration time to the tickets expiration time
if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;

// Add the cookie to the list for outgoing response
Response.Cookies.Add(cookie);

Session["Admin"] = true;
Session["userid"] = reader_exec["userid"].ToString();
Session["UserName"] = reader_exec["username"].ToString();
Session["Email"] = reader_exec["email"].ToString();
Session["Ruolo"] = reader_exec["ruolo"].ToString();

Response.Redirect("~/Admin/Administrator.aspx");
}
else
{
lblResult.Text = "Username / password incorrect. Please try again.";
lblResult.Visible = true;
}

reader_exec.Close();
}
}
}
}

TOPOAMORE Profilo | Expert

ma porca trota.....
hai provato quello che ti ho scritto?????

__.__.__.__.__.__

ASP 2.0 - VB 2008

serrax Profilo | Junior Member

ciao,
ho provato come hai detto tu topoamore...

if (this.LoginCtrl.Checked == true)
{
HttpCookie cookie = new HttpCookie("Cookiename");
cookie.Values.Add("Email", email.Text);
cookie.Values.Add("Password", pass.Text);
DateTime dtExpiry = DateTime.Now.AddDays(14);
Response.Cookies[FormsAuthentication.FormsCookieName].Expires = dtExpiry;
}

purtroppo non accade nulla, cioè se faccio il login e spunto il check e poi riscrivo il nome utente il textbox della password rimane bianco....

altri consigli??

TOPOAMORE Profilo | Expert

>ciao,
>ho provato come hai detto tu topoamore...
>
> if (this.LoginCtrl.Checked == true)
> {
>HttpCookie cookie = new HttpCookie("Cookiename");
>cookie.Values.Add("Email", email.Text);
>cookie.Values.Add("Password", pass.Text);
>DateTime dtExpiry = DateTime.Now.AddDays(14);
>Response.Cookies[FormsAuthentication.FormsCookieName].Expires
>= dtExpiry;
> }
>
>purtroppo non accade nulla, cioè se faccio il login e spunto
>il check e poi riscrivo il nome utente il textbox della password
>rimane bianco....
>
>altri consigli??
Si ma tu verifichi l'esistenza del coockie e successivamente vai a inserire i valori al loro posto dopo aver insetito il nome utente????

__.__.__.__.__.__

ASP 2.0 - VB 2008

serrax Profilo | Junior Member

ciao,
.... scusa ma non so dirti...
l'unica cosa che faccio oltre al check è al click del pulsante....

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, // Ticket version
email.Text,// Username associated with ticket
DateTime.Now, // Date/time issued
DateTime.Now.AddMinutes(30), // Date/time to expire
true, // "true" for a persistent user cookie
reader_exec["ruolo"].ToString(), // User-data, in this case the roles
FormsAuthentication.FormsCookiePath);// Path cookie valid for


string hash = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(
FormsAuthentication.FormsCookieName, // Name of auth cookie
hash); // Hashed ticket

// Set the cookie's expiration time to the tickets expiration time
if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;

// Add the cookie to the list for outgoing response
Response.Cookies.Add(cookie);

però non credo che faccio verifiche......

TOPOAMORE Profilo | Expert

Scusami una cosa...

ma se non verifiche l'esistenza del cookie e non inserisci i dati che ti asapetti che lo faccia in automatico ????

Il pezzo mancante è quello

Ti lascio libero di studiarti la cosa visto che gia sai come crearne uno.

Se ti serve una mano vai tranquillo posta e risolviamo

__.__.__.__.__.__

ASP 2.0 - VB 2008

serrax Profilo | Junior Member

Ciao,
ok allora ho visto un pochino la situazione e sono arrivato a questo punto:

if (!rm.Checked)
{

HttpCookie CookieName = new HttpCookie("CookieName");
Response.Cookies.Remove("CookieName");
Response.Cookies.Add(CookieName);

CookieName.Values.Add("Useremail", email.Text);
CookieName.Values.Add("Userpass", pass.Text);

DateTime dtExpiry = DateTime.Now.AddDays(10);
Response.Cookies["CookieName"].Expires = dtExpiry;

}

Così facendo penso di eseguire questi comandi: eliminare il cookie , aggiungere il cookie, aggiungere i valori....
però non funziona...... visto che non ci ho capito nulla chiedo umilmente scusa e consigli....

TOPOAMORE Profilo | Expert

Sei vicino alla soluzione e sarebbe bello se ci arrivvassi da solo....

allora il percorso da seguire è.....

1) login utente: Inserimento nome utente
1.1)verifica esistenza cookie
1.2)Esiste??? SI - Inserimento dati cookie
2)Login fallito? SI - mantengo il vecchio cookie
ritorno al procedimento 1)
3)Login fallito? NO -Elimino il vecchio cookie e creo il nuovo con i nuovi dati

Il gioco è fatto

Facci sapere

__.__.__.__.__.__

ASP 2.0 - VB 2008

serrax Profilo | Junior Member

Ciao...
diamine, non riesco proprio ho fatto come hai detto, eliminando la public check ed inserrendo tutto nel controllo del login, ma non riesco... ho anche pensato che forse ho un errore nella pagina asp.net ....
il check è configurato così:

<asp:CheckBox ID="LoginCtrl" runat="server" OnCheckedChanged="check" Text="Ricordami" />

è sbagliato??

può dipendere??
come faccio??? ci sto uscendo pazzo!!!

TOPOAMORE Profilo | Expert

><asp:CheckBox ID="LoginCtrl" runat="server" OnCheckedChanged="check"Text="Ricordami" />

modificalo cosi

<asp:CheckBox ID="LoginCtrl" runat="server" Text="Ricordami" />

Ti scrivo in Vb.net

Eliminazione cookie

Request.Cookies.Remove("nomecookie")

Lettura cookie

Request.Cookies("nomecookie").Value

Scrittura cookie

Dim cookie As HttpCookie = New HttpCookie("nomecookie") cookie.item("nomevalore")= "valore" cookie.Expires = #10/12/2005# Response.Cookies.Add(cookie)

detto cio il tuo codice deve essere una cosa del genere

if proceduraLogin(Utente,password)=true then
'login andato a buon fine
if loginctrl.check=checked then Request.Cookies.Remove("nomecookie") Dim cookie As HttpCookie = New HttpCookie("nomecookie") cookie.item("nomevalore")= "valore" cookie.item("nomevalore1")= "valore1" cookie.Expires = #10/12/2005# ' scadenza Response.Cookies.Add(cookie) end if end if

nell'evento di modifica dell'user inserirai:

Dim cookie As HttpCookie = Request.Cookies("nomecookie") If not cookie is nothing then 'verifica in caso di cookie inesistente password.text=cookie.item("password") end if

Guardati un po questi esempi che ho scritto al volo quindi scusami se ci sono errori ma questa è la procedura che dovresti adottare

__.__.__.__.__.__

ASP 2.0 - VB 2008

serrax Profilo | Junior Member

Ciao....
sarà ma più o meno abbiamo scritto la stessa cosa credo....
al più io avrei sbagliato l'ordine di come mettere le cose.....

in ogni caso ho fatto come mi hai indicato, ma il problema non si è risolto.....

mi sa che ci lascio stare....

grazie lo stesso...

TOPOAMORE Profilo | Expert

Si la prima parte è uguale è la seconda che ti manca...

in pratica quando scrivi l'user alla perdita del suo focus deve verificare che esista il cookie con quel nome

Solo questo ti manca e il gioco è fatto

__.__.__.__.__.__

ASP 2.0 - VB 2008

serrax Profilo | Junior Member

ciao,
ho provato a fare così:

if (CookieName != null)
{
CookieName.Values.Add("Userpass", pass.Text);
CookieName.Values.Add("Useremail", email.Text);
}

ma con nessun risultato...

non ci riesco, non fa niente.....
grazie lo stesso

TOPOAMORE Profilo | Expert

Si ma il codice dove l'hai messo?

__.__.__.__.__.__

ASP 2.0 - VB 2008

serrax Profilo | Junior Member

Allora ti faccio vedere com'è il mio codice...
prima vedo se il nome utente e la pass corrispondono in questo modo:

public bool CheckPassword(string Password)
{
string ConnStrS = "Server=localhost;Database=eshop;uid=root;password=giovanni;";

MySqlConnection con = new MySqlConnection(ConnStrS);
{
con.Open();
MySqlCommand checkPassword = new MySqlCommand("SELECT COUNT(*) FROM `user` WHERE password='" + pass.Text + "'", con);
checkPassword.Parameters.AddWithValue("@pass", Password);
int rows = Convert.ToInt32(checkPassword.ExecuteScalar());
return (rows > 0);
}
}

Idem per l'username.....

poi al pulsante "Accedi" ho questo codice:

string ConnStrS = "Server=localhost;Database=eshop;uid=root;password=giovanni;";
MySqlConnection con = new MySqlConnection(ConnStrS);
{
MySqlCommand query = new MySqlCommand("SELECT ruolo FROM `user` WHERE email='" + email.Text + "' ", con);
con.Open();
int rows = Convert.ToInt32(query.ExecuteScalar());
con.Close();
if (rows == 0)
{

string Email = email.Text;
string Password = pass.Text;
if (CheckEmail(Email) == false)
{
lblResult.Text = "Email errata";

}
else if (CheckPassword(Password) == false)
{
lblResult.Text = "Password errata";
}
else
{

con.Open();
string SQL = "SELECT * FROM `user` WHERE email='" + email.Text + "' and password='" + pass.Text + "'";
MySqlCommand reader_command = new MySqlCommand(SQL, con);
reader_command.Parameters.AddWithValue("@email", email.Text);
reader_command.Parameters.AddWithValue("@pass", pass.Text);
MySqlDataReader reader_exec = reader_command.ExecuteReader();

if (reader_exec.Read())
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, // Ticket version
email.Text,// Username associated with ticket
DateTime.Now, // Date/time issued
DateTime.Now.AddHours(2), // Date/time to expire
true, // "true" for a persistent user cookie
reader_exec["ruolo"].ToString(), // User-data, in this case the roles
FormsAuthentication.FormsCookiePath);// Path cookie valid for
string hash = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(
FormsAuthentication.FormsCookieName, // Name of auth cookie
hash); // Hashed ticket

// Set the cookie's expiration time to the tickets expiration time
if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;
Response.Cookies.Add(cookie);

Session["userlogin"] = true;
Session["userid"] = reader_exec["userid"].ToString();
Session["UserName"] = reader_exec["username"].ToString();
Session["Email"] = reader_exec["email"].ToString();
Session["Ruolo"] = reader_exec["ruolo"].ToString();

CheckBox rm = (CheckBox)LoginCtrl.FindControl("RememberMe");
if (rm != null)
{
if (!rm.Checked)
{

Response.Cookies.Remove("CookieName");

HttpCookie CookieName = new HttpCookie("CookieName");

CookieName.Values.Add("Useremail", email.Text);
CookieName.Values.Add("Userpass", pass.Text);

Response.Cookies.Add(CookieName);

DateTime dtExpiry = DateTime.Now.AddDays(10);
Response.Cookies["CookieName"].Expires = dtExpiry;

}
}
Response.Redirect("~/user/user.aspx?userid=" + Session["userid"] + "", false);
}
else
{
lblResult.Text = "Username / password incorrect. Please try again.";
lblResult.Visible = true;
}
reader_exec.Close();
}
}

questo è quanto....


TOPOAMORE Profilo | Expert

ti dico quello che fare
> public bool CheckPassword(string Password)
> {
>string ConnStrS = "Server=localhost;Database=eshop;uid=root;password=giovanni;";
>
> MySqlConnection con = new MySqlConnection(ConnStrS);
> {
> con.Open();
>MySqlCommand checkPassword = new MySqlCommand("SELECT COUNT(*)
>FROM `user` WHERE password='" + pass.Text + "'", con);
>checkPassword.Parameters.AddWithValue("@pass", Password);
>int rows = Convert.ToInt32(checkPassword.ExecuteScalar());
> return (rows > 0);
> }
> }
>
1) userei stored e non sql puro via codice

>Idem per l'username.....

2)Idem per l'username.....


>CheckBox rm = (CheckBox)LoginCtrl.FindControl("RememberMe");
> if (rm != null)
> {
> if (!rm.Checked)
> {

queste due istruzioni non le ho capite nel senso:

se rm non è null
se rm non è ceckato --- questo non dovrebbe essere se rm è ceckato per poi creare il cookie?????

>Response.Cookies.Remove("CookieName");
>
>HttpCookie CookieName = new HttpCookie("CookieName");
>
>CookieName.Values.Add("Useremail", email.Text);
>CookieName.Values.Add("Userpass", pass.Text);
>
>Response.Cookies.Add(CookieName);
>
>DateTime dtExpiry = DateTime.Now.AddDays(10);
>Response.Cookies["CookieName"].Expires = dtExpiry;
>
> }
> }
>Response.Redirect("~/user/user.aspx?userid=" + Session["userid"]
>+ "", false);
> }
> else
> {
>lblResult.Text = "Username / password incorrect. Please try again.";
> lblResult.Visible = true;
> }
> reader_exec.Close();
> }
> }
>
bene ma a te manca sempre il richiamo del cookie!!!!!!

nel tag dove si inserisce la username
esempio

<asp:textbox runat="server" id="username"/>

devi associargli l'evento

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

o meglio se riesci a gestire la perdita del focus

e inserire dentro a quest'evento la gestione di verifica di esistenza del cookie con successiva scrittura dei dati

Dimmi ancora se ti serve una mano

ciaooo

__.__.__.__.__.__

ASP 2.0 - VB 2008
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5