Ciao a tutti,
ho da poco installato Visual Studio 2008 che, nei miei programmi dovrà rimpiazzare il 2005 a breve.
Per iniziare ho provato a convertire via wizard un progetto asp.net realizzato con vs2005 per iniziare a gestirlo con vs2008.
La conversione è andata a buon fine e tutto sembrava funzionare bene (a parte qualche problemino con le variabili di sessione).
MA...per accedere a questa applicazione è necessario effettuare il login.
Ho creato due sezioni nel sito, una di amministrazione e una "utente". Di conseguenza sono stati creati due gruppi di utenti: gli amministratori che possono vedere entrambe le sezioni, e gli "users" che possono vedere solo la parte "utente".
Le due sezioni sono contenute in due cartelle distinte e per garantire quanto detto qui sopra ho creato due web.config, uno per ognuna delle sezioni.
Tutto funzionava benissimo fino a quando non ho convertito il progetto in VS2008. Adesso accade che l'utente effettua il login ma non risulta mai autenticato.
Mi spiego meglio: se l'utente sbaglia password il sistema glielo segnala e lo fa procedere solo nel caso in cui username e pwd siano corretti. Quando però accede alle altre pagine Context.User.Identity.Name è blank e Context.User.Identity.IsAuthenticated è false.
Web.Config per la parte (folder) admin:
<authorization>
<allow roles="administrators"/>
<deny users="*" />
</authorization>
Web.Config per la parte (folder) users:
<authorization>
<allow roles="administrators,users"/>
<deny users="*" />
</authorization>
Mentre il web.config contenuto nella root del sito, dove c'è la pagina di Login contiene:
<authentication mode="Forms">
<forms name="myform" loginUrl="login.aspx" protection="All" timeout="20" defaultUrl="common/default.aspx"/>
</authentication>
Nel global.asax ho messo scritto questo:
Sub Application_AuthenticateRequest(ByVal s As Object, ByVal e As EventArgs)
If Request.IsAuthenticated Then
Dim sName As String = User.Identity.Name
Dim sRole As String = sName.Substring(sName.LastIndexOf("|") + 1)
Dim sGrpArr() As String = {sRole}
Dim oIdentity As GenericIdentity = New GenericIdentity(sName)
Context.User = New GenericPrincipal(oIdentity, sGrpArr)
End If
End Sub
(Un esempio di stringa sName per è "admin|1|administrators")
Mentre nella pagina di login c'è questo codice
Try
Dim sUserNameRole = CheckCredentials(txtBoxUserName.Text, txtBoxPwd.Text)
If (sUserNameRole <> "") Then
FormsAuthentication.RedirectFromLoginPage(sUserNameRole, False)
Else
Msg.Text = "Nome utente o password non corretti. Riprovare"
End If
Catch ex As Exception
Msg.Text = "Si è verificato un errore nella fase di connessione al database: " & ex.Message
End Try
Subito dopo la RedirectFromLoginPage Context.User.Identity.IsAuthenticated è false.
Tra l'altro se non ricordo male, lo spunto per la gestione degli utenti l'avevo preso proprio da uno degli esempi presenti sul sito...
Grazie.