11.886 messaggi dal 09 febbraio 2002
Contributi

spero di avere capito bene

Sì, hai fatto giusto, e infatti l'errore è sparito.

Adesso possiamo andare avanti.
Nella Sub btnLogin devi mettere questo codice:

    Protected Sub btnClick(sender As Object, e As EventArgs)
       'Verifico se user e password sono corretti
        If FormsAuthentication.Authenticate(txtUser.Text, txtPass.Text) Then
            'Se sì, imposto il cookie di autenticazione e reindirizzo l'utente alla homepage
            FormsAuthentication.SetAuthCookie(txtUser.Text, False)
            Response.Redirect("/")
        End If
    End Sub


A questo punto il login funzionerà e gli utenti potranno accedere all'area riservata. Da quanto vedo da questo pezzo di web.config, tu le pagine riservate le vuoi mettere sotto la directory Admin, e va bene.
<location path="Admin">
    <system.web>
      <authorization>
        <deny users="?" />
      </authorization>
    </system.web>
  </location>


Quindi creati una pagina aspx qualsiasi dentro /Admin e vedrai che la potrai raggiungere solo dopo esserti loggato.

ciao,
Moreno

PS. questa tecnica funziona ma è obsoleta. E mettere le password in chiaro nel web.config non rispetta varie normative europee.
Modificato da BrightSoul il 19 febbraio 2019 14:12 -

Enjoy learning and just keep making
254 messaggi dal 01 agosto 2003
ciao Moreno grazie mille funziona

una domanda
in che senso non vengono rispettate le normative europee?
esiste un modo migliore per proteggere le pagine?

grazie 1000

victor
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Victor,


in che senso non vengono rispettate le normative europee?

Quando sviluppi un'applicazione web hai una responsabilità nei confronti dei tuoi utenti: fare tutto il possibile per mantenere i loro dati al sicuro, in modo che non siano inavvertitamente divulgati a terzi, neanche in caso di attacco informatico. Questo non è solo un principio da applicare per questioni etico-professionali ma anche per questioni legislative.

Leggi questa discussione, che contiene dei commenti ben argomentati a proposito della gestione delle password nel rispetto della normativa europea del GDPR.
https://law.stackexchange.com/questions/19519/to-comply-with-gdpr-do-i-need-passwords-hashed

Il file web.config, in cui hai messo le credenziali, non fornisce livelli di protezione adeguati. Al momento le tue password non sono protette in alcun modo, perché sono in chiaro, ma anche se impostassi passwordFormat="SHA1" non sarebbe un gran miglioramento perché le tue password potrebbero essere recuperate in un batter d'occhio grazie alle rainbow tables e alla completa mancanza di un salt.

Per questo Microsoft ha reso obsoleto il metodo FormsAuthentication.Authenticate e hai riprova di questo da Visual Studio, che aggiunge una sottolineatura ondulata al di sotto.

I problemi di usare questo sistema sono:
  • Se qualcuno riesce ad accedere via FTP, entrerà in possesso della password e sarà molto facile per lui acquisire accesso ammministrativo all'applicazione;
  • Il rischio ancora maggiore, è che se il tuo cliente ti chiede di impostare una specifica password, tu non puoi sapere se lui l'ha usata anche per il suo account paypal. Di conseguenza, se la password viene compromessa, allora anche il suo account paypal è potenzialmente compromesso;
  • Non dai al tuo cliente alcun modo per cambiare la password in autonomia nel momento in cui sa che è stata compromessa.



esiste un modo migliore per proteggere le pagine?


Certo, per nuove applicazioni dovresti usare ASP.NET Identity che include tutti i più moderni accorgimenti per conservare i dati dei tuoi utenti (password comprese) in sicurezza.
E' più complicato da usare rispetto alla soluzione che hai ora ma del resto la questione che riguarda la sicurezza non è lei stessa semplice da affrontare.
Qui su aspitalia abbiamo scritto varie cose; puoi iniziare da questa.
https://www.aspitalia.com/articoli/asp.net4.5.1/security-asp.net-mvc-identity.aspx

Puoi ovviamente decidere di ignorare completamente questo aspetto, che ti costerebbe indubbiamente molto tempo e impegno, e continuare con la soluzione semplicistica che hai ora. Tutto "si può fare" come cantava Branduardi ma al minimo dovresti informare il tuo cliente che l'applicazione non è conforme alla normativa del GDPR e che rischia una sanzione.
https://www.altalex.com/documents/news/2018/04/04/gdpr-le-sanzioni-privacy

ciao,
Moreno
Modificato da BrightSoul il 20 febbraio 2019 08:51 -

Enjoy learning and just keep making
333 messaggi dal 05 novembre 2012
chapeau! gran risposta Moreno!

/Ciao

Alessio
254 messaggi dal 01 agosto 2003
Ciao Moreno
grazie infinite per la tua risposta molto esaustiva.
Pero' al momento, viste le mie scarse conoscenze, non mi sento in grado di affrontare asp identity.

Vorrei ritornare sul discorso di prima perche' ci sono delle cose che ancora non mi sono chiare.
grazie

Per adesso sono riuscito (grazie a te) nell'intento di fare accedere con login e pass
nel web config come sai ho messo questo

<credentials passwordFormat="Clear">
<user name="paolino" password="paperino" />
<user name="paperon" password="depaperoni" />
</credentials>


Ti chiedo:

1) se io volessi estrapolare dati da un database? come posso fare?
ovvero
invece di scrivere (sempre nel web confing) <user name="paolino" password="paperino" />
le pass e le user le estraggo da un db. Si puo' fare?


2)
nella pagina login ce questo

If FormsAuthentication.Authenticate(txtUser.Text, txtPass.Text) Then
'Se sì, imposto il cookie di autenticazione e reindirizzo l'utente alla homepage
FormsAuthentication.SetAuthCookie(txtUser.Text, False)

La mia domanda è: viene creato un cookie per caso? Questo cookie ha un valore interno che corrisponde alla user name? che durata ha questo cookie?


3)
altra domanda che non centra nulla con tutto questo ma che mi sento di fare ad una persona competente come te:
ma perchè tutti continuano a dire che php è meglio di aspnet?
sono anni che io uso asp net e penso si fantastico. Tu che ne dici?





Grazie mille per tutto !!!!!!!

victor
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, prego!

le pass e le user le estraggo da un db. Si puo' fare?

Sì, e in questo modo potrai proteggerle meglio. Se non vuoi usare ASP.NET Core Identity, c'è un sistema precedente chiamato Membership API di cui puoi leggere qui.
https://www.aspitalia.com/articoli/asp.net2/membership_roles_api.aspx

Vedi se lo reputi più facile di ASP.NET Identity. Secondo me, in merito di sicurezza, è sempre meglio usare qualcosa fatto da autori attendibili (come Microsoft) piuttosto che ricreare la propria soluzione personalizzata.

Comunque, se alla fine decidi di realizzare la tua soluzione personalizzata, non dovresti salvare le password in chiaro nel database ma calcolarti un hash in maniera sicura.
Puoi usare una classe come questa, che usa un apposito algoritmo di derivazione che calcolerà l'hash per un migliaio di volte così da scoraggiare coloro che dovessero entrare in possesso del tuo database in maniera non autorizzata.
https://cmatskas.com/-net-password-hashing-using-pbkdf2/


La mia domanda è: viene creato un cookie per caso? Questo cookie ha un valore interno che corrisponde alla user name?

Internamente sì, c'è anche lo username ma l'intero contenuto del cookie viene cifrato da ASP.NET e quindi non è alterabile dall'utente. Se non fosse così potrebbe fingersi qualcun altro.
Puoi recuperare lo username dell'utente loggato in questo modo:
Dim nomeUtente As String = Nothing
'Prima verifico se l'utente risulta loggato
If User.Identity.IsAuthenticated Then
  nomeUtente = User.Identity.Name
End If



che durata ha questo cookie?

Lo puoi decidere tu. Quando chiami SetAuthCookie, se nel secondo parametro passi False allora verrà creato un cookie di sessione che scadrà automaticamente alla chiusura del browser. Se invece passi True allora il cookie sarà persistente, che sopravvivrà anche al riavvio del browser. La durata effettiva la puoi impostare nel web.config.
<forms slidingExpiration="true" timeout="60" name=".MYSITEAUTH" loginUrl="Login.aspx" protection="All" >
</form>

In questo modo il cookie durerà per 60 minuti ma, dato che è stato impostato slidingExpiration="true", allora questi 60 minuti verranno rinnovati fintanto che l'utente continua a visitare il sito.
Se imposti slidingExpiration="false", saranno 60 minuti non rinnovabili (cioè una scadenza assoluta).

A proposito del PHP: io al momento sto usando in egual misura sia ASP.NET Core che PHP. Riesco a fare cose belle con entrambi ma preferisco il linguaggio C# e ASP.NET Core. Stasera in caso sarò più specifico.


tutti continuano a dire che php è meglio di aspnet?

Posta qualche link per contestualizzare le opinioni di queste persone.


chapeau!

;)

Enjoy learning and just keep making
254 messaggi dal 01 agosto 2003
grazie
per estrarre la pass da un db
come faccio a collegarmi al db stesso?
devo fare tutto nel web config?

grazie

victor
254 messaggi dal 01 agosto 2003
perche' io attualmente
in ogni pagina aspx
metto una cosa del genere

if(request.Cookies("utente_logato_sul_dansof").value="nessuno") then
response.Redirect("pagina_identificazione.aspx")
end if


ovvero se l'utente non è loggato non puo entrare.
Se non e' logato viene reindirizzato alla pagina di identificazione
la quale pagina ha una textbox in cui l'utente inserisce la sua pass

dim objcmd2 as new oledbcommand ("select * from login where pass='"& valore &"' ", objconn)

  dim read as oledbdatareader
  
  objconn.open
  read=objcmd2.executereader
  
  dim c as integer=0
  while read.read
c=c+1
nome_utente=(read.getstring(2))
  end while
read.close
objcmd2.connection.close()




if (c=0) then
response.Write("pass errata RIPROVARE")


else
response.Cookies("utente_logato_sul_dansof").value=nome_utente
response.Cookies("utente_logato_sul_dansof").expires=datetime.now.addmonths(12)'cosi scade dopo un mese





se la pass è corretta viene creato un cookie


sicuramente ci sono dei modi piu' efficaci.

Ma al momento cio' che desidero sapere è se esiste la possibilita' di NON mettere la parte di identificazione su ogni pagina. Bensi fare in modo che il web config faccia tutto questo.

Grazie

victor

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.