using System; using System.Collections.Generic; using System.Text; using ETS_Data; using System.IO; using System.Web; using NLog; namespace ETS_Data { /// /// classe gestione utente: auth e permission/ruoli - versione GENERICA /// public class user_std { /* Classe che si occupa di: * ---------------------------------------- * 1) gestione username * 2) gestione ruoli da anagrafica * 3) gestione declinazione ruoli in permessi * 4) gestione vocabolario * * in Standard GENERICO */ #region Protected Fields protected Logger lg = LogManager.GetCurrentClassLogger(); #endregion Protected Fields #region Public Fields /// /// versione statica della classe utente come singleton UtenTeSignletoN /// public static user_std UtSn = new user_std(); #endregion Public Fields #region Public Constructors /// /// inizializza la gestione utente... /// public user_std() { } #endregion Public Constructors #region Public Properties /// /// pagina correntemente visualizzata (URL in sessione) /// public static string pagCorrente { get { return utils.obj.StringSessionObj("pagCorrente"); } set { utils.obj.setSessionVal("pagCorrente", value); } } /// /// pagina precedentemente visualizzata (URL in sessione) /// public static string pagPrecedente { get { return utils.obj.StringSessionObj("pagPrecedente"); } set { utils.obj.setSessionVal("pagPrecedente", value); } } /// /// restituisce una stringa formattata con cognome /// public string cognome { get { string answ = ""; if (isAuth) { answ = string.Format("{0}", rigaUtente.COGNOME); } return answ; } } /// /// restituisce una stringa formattata con cognome e nome /// public string CognomeNome { get { string answ = ""; if (isAuth) { answ = string.Format("{0} {1}", rigaUtente.COGNOME, rigaUtente.NOME); } return answ; } } /// /// restituisce una stringa formattata con cognome, nome e matricola /// public string CognomeNomeMatr { get { return string.Format("{0} {1} ({2})", rigaUtente.COGNOME, rigaUtente.NOME, rigaUtente.MATRICOLA); } } /// /// utente correntemente connesso per utilizzo FileSystem (Formato dominio.username) /// public string currUser_FS { get { return currUserAD.Replace(@"\", "."); } } /// /// utente correntemente connesso (Formato dominio\username) /// public string currUserAD { get { string answ = ""; try { if (HttpContext.Current.User.Identity.IsAuthenticated) { answ = HttpContext.Current.User.Identity.Name; } } catch { } return answ; } } /// /// utente correntemente connesso (Formato Cognome nome) /// public string currUserCognomeNome { get { string answ = "-"; try { // controllo in sessione... if (utils.obj.isInSessionObject("currUserCognomeNome")) { answ = utils.obj.StringSessionObj("currUserCognomeNome"); } else { // cerco user da elenco... DS_Anagrafica.UtentiRow riga = (DS_Anagrafica.UtentiRow)utils.obj.taUtenti.getByKey(currUserAD)[0]; answ = string.Format("{0} {1}", riga.Cognome, riga.Nome); utils.obj.setSessionVal("currUserCognomeNome", answ); } } catch { } return answ; } } /// /// EMAIL utente correntemente connesso /// public string currUserEmail { get { string answ = "info@ets.it"; try { // controllo in sessione... if (utils.obj.isInSessionObject("currUserEmail")) { answ = utils.obj.StringSessionObj("currUserEmail"); } else { // cerco user da elenco... DS_Anagrafica.UtentiRow riga = (DS_Anagrafica.UtentiRow)utils.obj.taUtenti.getByKey(currUserAD)[0]; answ = riga.email; utils.obj.setSessionVal("currUserEmail", answ); } } catch { answ = "info@ets.it"; } return answ; } } /// /// UserId (AD) utente correntemente connesso /// public string currUserId { get { // controllo e salvo in sessione se necessario... if (!utils.obj.isInSessionObject("currUserId")) { utils.obj.setSessionVal("currUserId", currUserAD); } return currUserAD; } } /// /// utente correntemente connesso (Formato Nome Cognome) /// public string currUserNomeCognome { get { string answ = "-"; try { // controllo in sessione... if (utils.obj.isInSessionObject("currUserNomeCognome")) { answ = utils.obj.StringSessionObj("currUserNomeCognome"); } else { // cerco user da elenco... DS_Anagrafica.UtentiRow riga = (DS_Anagrafica.UtentiRow)utils.obj.taUtenti.getByKey(currUserAD)[0]; answ = string.Format("{0} {1}", riga.Nome, riga.Cognome); utils.obj.setSessionVal("currUserNomeCognome", answ); } } catch { } return answ; } } /// /// restituisce la tabella diritti da session /// public DataLayer_AnagGen.DIRITTIDataTable diritti { get { return (DataLayer_AnagGen.DIRITTIDataTable)utils.obj.objSessionObj("dirittiUtente"); } set { utils.obj.setSessionVal("dirittiUtente", value); } } /// /// oggetto dominio con metodi get/set /// public string dominio { get { return utils.obj.StringSessionObj("DOMINIO"); } set { utils.obj.setSessionVal("DOMINIO", value); } } /// /// è un boolean che indica se in session ci siano user/dominio e quindi utente autenticato in precedenza... /// public bool isAuth { get { return (utente != "" && dominio != ""); } } /// /// restituisce true se utente forzato da forceUser.aspx /// public bool isForcedUser { get { return utils.obj.BoolSessionObj("isForcedUser"); } set { utils.obj.setSessionVal("isForcedUser", value); } } /// /// oggetto lingua utente con metodi get/set /// public string lingua { get { return utils.obj.StringSessionObj("Lingua").ToUpper(); } set { utils.obj.setSessionVal("Lingua", value); } } /// /// fornisce un file XML della mappa del sito abilitato per l'utente... /// public string mappaSito { get { return utils.obj.StringSessionObj("mappaSito"); } set { utils.obj.setSessionVal("mappaSito", value); } } /// /// oggetto modulo (applicazione) con metodi get/set /// public string modulo { get { return utils.obj.confReadString("CodModulo"); } } /// /// restituisce una stringa formattata con nome /// public string nome { get { string answ = ""; if (isAuth) { answ = string.Format("{0}", rigaUtente.NOME); } return answ; } } /// /// restituisce una stringa formattata con nome e cognome /// public string NomeCognome { get { string answ = ""; if (isAuth) { answ = string.Format("{0} {1}", rigaUtente.NOME, rigaUtente.COGNOME); } return answ; } } /// /// oggetto password con metodi get/set /// public string passwd { get { return utils.obj.StringSessionObj("passwd"); } set { utils.obj.setSessionVal("passwd", value); } } /// /// tabella dei permessi utente /// public DataLayer_AnagGen.PermessiDataTable permessi { get { DataLayer_AnagGen.PermessiDataTable tabPermessi = null; try { tabPermessi = (DataLayer_AnagGen.PermessiDataTable)utils.obj.objSessionObj("permessiUtente"); } catch (Exception exc) { lg.Error($"Errore recupero permessi!{Environment.NewLine}{exc}"); } return tabPermessi; } set { utils.obj.setSessionVal("permessiUtente", value); } } /// /// tabella dei permessi utente di tipo "WRITE" enabled /// public DataLayer_AnagGen.PermessiDataTable permessiWrite { get { return (DataLayer_AnagGen.PermessiDataTable)utils.obj.objSessionObj("permessiUtenteWrite"); } set { utils.obj.setSessionVal("permessiUtenteWrite", value); } } /// /// restituisce i valori della riga utente da db /// public DataLayer_AnagGen.UTENTERow rigaUtente { get { return (DataLayer_AnagGen.UTENTERow)utils.obj.objSessionObj("rigaUtente"); } set { utils.obj.setSessionVal("rigaUtente", value); } } /// /// restituisce una stringa della sigla dell'utente /// public string sigla { get { string answ = ""; if (isAuth) { answ = rigaUtente.SIGLA; } return answ; } } /// /// retituisce username AD /// public string userNameAD { get { return string.Format(@"{0}\{1}", dominio, utente); } } /// /// oggetto utente con metodi get/set /// public string utente { get { return utils.obj.StringSessionObj("USER_NAME"); } set { utils.obj.setSessionVal("USER_NAME", value); } } #endregion Public Properties #region Protected Methods /// /// cancella da session l'utente /// protected void clearAllUserData() { utils.obj.emptySessionVal("USER_NAME"); utils.obj.emptySessionVal("DOMINIO"); utils.obj.emptySessionVal("permessiUtente"); } /// /// Effettua setup dei permessi una volta salvati i diritti /// protected virtual void setPermessiDaDiritti() { // proseguo coi permessi DataLayer_AnagGen.PermessiDataTable allPermessi = DataWrap.DW.taPermessi.GetData(); DataLayer_AnagGen.Permessi2FunzioneDataTable allPerm2Funz = DataWrap.DW.taPermessi2Funzione.GetData(); DataLayer_AnagGen.PermessiDataTable _permessiUtente = new DataLayer_AnagGen.PermessiDataTable(); DataLayer_AnagGen.PermessiDataTable _permessiUtenteWrite = new DataLayer_AnagGen.PermessiDataTable(); string filtroFunz, filtroPerm, filtroPermWrite; filtroPerm = " COD_PERMESSO IN ("; filtroPermWrite = " COD_PERMESSO IN ("; // filtro i diritti utente x non avere duplicati... Dictionary funzioniUtente = new Dictionary(); foreach (DataLayer_AnagGen.DIRITTIRow riga in diritti) { try { funzioniUtente.Add(riga.COD_FUNZIONE, riga.COD_FUNZIONE); } catch { } } foreach (KeyValuePair kvp in funzioniUtente) { filtroFunz = string.Format("COD_FUNZIONE='{0}'", kvp.Value); // recupero le righe dei righe2perm DataLayer_AnagGen.Permessi2FunzioneRow[] righe_p2f = (DataLayer_AnagGen.Permessi2FunzioneRow[])allPerm2Funz.Select(filtroFunz); foreach (DataLayer_AnagGen.Permessi2FunzioneRow riga_p2f in righe_p2f) { filtroPerm += string.Format("'{0}', ", riga_p2f.COD_PERMESSO); // se è write metto in tab relativa... try { if (riga_p2f.READWRITE == "S") { filtroPermWrite += string.Format("'{0}', ", riga_p2f.COD_PERMESSO); } } catch { } } } if (filtroPerm == " COD_PERMESSO IN (") { filtroPerm += "'PermessiNonTrovati' "; } filtroPerm = filtroPerm.Remove(filtroPerm.Length - 2); filtroPerm += ") "; DataLayer_AnagGen.PermessiRow[] righePerm = (DataLayer_AnagGen.PermessiRow[])allPermessi.Select(filtroPerm, "GRUPPO, NUMERO"); foreach (DataLayer_AnagGen.PermessiRow rigaPerm in righePerm) { _permessiUtente.ImportRow(rigaPerm); } permessi = _permessiUtente; // salvo, se ci sono, permessi write... if (filtroPermWrite != " COD_PERMESSO IN (") { filtroPermWrite = filtroPermWrite.Remove(filtroPermWrite.Length - 2); filtroPermWrite += ") "; DataLayer_AnagGen.PermessiRow[] righePermW = (DataLayer_AnagGen.PermessiRow[])allPermessi.Select(filtroPermWrite, "GRUPPO, NUMERO"); foreach (DataLayer_AnagGen.PermessiRow rigaPerm in righePermW) { _permessiUtenteWrite.ImportRow(rigaPerm); } } permessiWrite = _permessiUtenteWrite; } /// /// Carica la tabella diritti dell'utente da db e salva in session /// protected virtual void setupDirittiPermessi() { DataLayer_AnagGen.DIRITTIDataTable _dirittiUtente = DataWrap.DW.taDiritti.GetByUserDominioModulo(utente, dominio, modulo); diritti = _dirittiUtente; // salvo in session i diritti.. setPermessiDaDiritti(); } /// /// Carica la tabella diritti dell'utente da db e salva in session SOLO per il CDC indicato /// /// protected virtual void setupDirittiPermessi(string cdc) { DataLayer_AnagGen.DIRITTIDataTable _dirittiUtente = DataWrap.DW.taDiritti.GetByUserDominioModuloCdc(utente, dominio, modulo, cdc); diritti = _dirittiUtente; // salvo in session i diritti.. setPermessiDaDiritti(); } /// /// Carica la tabella diritti dell'utente da db e salva in session /// protected virtual void setupDirittiPermessiByUsername() { DataLayer_AnagGen.DIRITTIDataTable _dirittiUtente = DataWrap.DW.taDiritti.GetByUserModulo(utente, modulo); diritti = _dirittiUtente; // salvo in session i diritti.. setPermessiDaDiritti(); } /// /// carica la riga dati utente /// protected virtual void setupRiga() { //logger.lg.scriviLog(string.Format(@"setupRiga x utente {0}\{1}", dominio, utente), tipoLog.STARTUP); DataLayer_AnagGen.UTENTERow _rigaUtenteAnagGen = ((DataLayer_AnagGen.UTENTERow)DataWrap.DW.taUtente.GetDataByUtenteDominio(utente, dominio).Rows[0]); rigaUtente = _rigaUtenteAnagGen; } #endregion Protected Methods #region Public Methods /// /// verifica le credenziali AD dell'utente... /// /// /// /// public virtual bool ADuserOk(string dominio, string username) { bool isOk = false; // ...verifico sia in tabella utenti... bool isOkUser = false; // ...e che abbia diritti per l'applicativo... bool isOkPerm = false; // controllo se richiesta autenticazione completa dominio + username o solo username... bool authSenzaDominio = false; try { authSenzaDominio = utils.obj.confReadBool("authSenzaDominio"); } catch { } if (authSenzaDominio) { isOkUser = (DataWrap.DW.taUtente.getByUserName(username).Rows.Count >= 1); isOkPerm = (DataWrap.DW.taDiritti.GetByUserModulo(username, modulo).Rows.Count >= 1); } else { isOkUser = (DataWrap.DW.taUtente.GetDataByUtenteDominio(username, dominio).Rows.Count >= 1); isOkPerm = (DataWrap.DW.taDiritti.GetByUserDominioModulo(username, dominio, modulo).Rows.Count >= 1); } // risultato... isOk = (isOkUser && isOkPerm); return isOk; } /// /// assegna il diritto all'utente indicato /// /// /// /// /// /// /// public bool assegnaDirittoUtente(string username, string cod_cdc, string cod_modulo, string cod_funzione) { bool answ = false; try { DataWrap.DW.taDiritti.Insert(username, cod_cdc, cod_modulo, cod_funzione, "-1"); answ = true; } catch (Exception exc) { lg.Error($"Eccezione:{Environment.NewLine}{exc}"); } return answ; } /// /// restituisce cognome e nome di un utente dato username eventualmente comprensivo di dominio... /// /// {dominio\}userName /// public string CognomeNomeDaUser(string userNameFull) { string answ = "-"; // se contiene "\" allora è con dominio... if (userNameFull.IndexOf('\\') > -1) { string[] userData = userNameFull.ToString().Split('\\'); answ = CognomeNomeDaUsername(userData[1], userData[0]); } else { answ = CognomeNomeDaUsername(userNameFull); } return answ; } /// /// restituisce cognome e nome di un utente dato username... /// /// username /// public string CognomeNomeDaUsername(string userName) { string answ = "-"; try { DataLayer_AnagGen.UTENTERow riga = DataWrap.DW.taUtente.getByUserName(userName)[0]; answ = string.Format("{0} {1}", riga.COGNOME, riga.NOME); } catch { } return answ; } /// /// restituisce cognome e nome di un utente dato username e dominio... /// /// username /// dominio /// public string CognomeNomeDaUsername(string userName, String dominio) { string answ = "-"; try { DataLayer_AnagGen.UTENTERow riga = DataWrap.DW.taUtente.GetDataByUtenteDominio(userName, dominio)[0]; answ = string.Format("{0} {1}", riga.COGNOME, riga.NOME); } catch { } return answ; } /// /// restituisce cognome e nome di un utente data la matricola... /// /// matricola /// public string CognomeNomeMatrDaMatricola(string matricola) { string answ = "-"; try { DataLayer_AnagGen.UTENTERow riga = DataWrap.DW.taUtente.getByMatricola(matricola)[0]; answ = string.Format("{0} {1} ({2})", riga.COGNOME, riga.NOME, riga.MATRICOLA); } catch { } return answ; } /// /// crea un nuovo utente con le credenziali indicate /// /// /// /// /// /// /// /// public bool creaUtente(string dominio, string username, string cognome, string nome, string cod_cdc, string email, string matricola, string sigla) { bool answ = false; try { DataWrap.DW.taUtente.Insert(dominio, username, cognome, nome, "1", matricola, cod_cdc, email, sigla, "IT", "s"); answ = true; } catch { } return answ; } /// /// restituisce l'elenco degli utenti dato i diritti che devono avere come modulo/funzione /// /// nome del modulo /// nome della funzione /// tabella utenti public DataLayer_AnagGen.UTENTEDataTable elencoDaDiritti(string codModulo, string codFunzione) { return DataWrap.DW.taUtente.getElencoByDiritti(codModulo, codFunzione); } /// /// restituisce l'elenco delle email degli utenti dato i diritti che devono avere come modulo/funzione /// /// nome del modulo /// nome della funzione /// stringa di email separate da "," public string elencoEmailDaDiritti(string codModulo, string codFunzione) { char sep = ','; string answ = ""; try { foreach (DataLayer_AnagGen.UTENTERow riga in elencoDaDiritti(codModulo, codFunzione)) { answ += string.Format("{0}{1} ", riga.EMAIL, sep); } if (answ.Length > 2) { answ = answ.Substring(0, answ.Length - 2); } } catch { } return answ; } /// /// restituisce email di un utente dato username e dominio... /// /// Cognome Nome /// public string emailDaCognomeNome(string CognomeNome) { string answ = "-"; try { DataLayer_AnagGen.UTENTERow riga = DataWrap.DW.taUtente.getByCognomeNome(CognomeNome)[0]; answ = riga.EMAIL; } catch { } return answ; } /// /// restituisce email di un utente dato username... /// /// username /// public string emailDaUsername(string userName) { string answ = "-"; try { DataLayer_AnagGen.UTENTERow riga = DataWrap.DW.taUtente.getByUserName(userName)[0]; answ = riga.EMAIL; } catch { } return answ; } /// /// restituisce email di un utente dato username e dominio... /// /// username /// dominio /// public string emailDaUsername(string userName, String dominio) { string answ = "-"; try { DataLayer_AnagGen.UTENTERow riga = DataWrap.DW.taUtente.GetDataByUtenteDominio(userName, dominio)[0]; answ = riga.EMAIL; } catch { } return answ; } /// /// restituisce l'elenco delle funzioni abilitate dato modulo ed username partendo dalla radice dell'albero dei diritti /// /// /// /// public DataLayer_AnagGen.FUNZIONEDataTable funzioniUtente(string codModulo, string user_name) { return DataWrap.DW.taFunzione.getFunByDiritti_999(codModulo, user_name); } /// /// restituisce la tabella (per utente corrente) dei CDC abilitati per l'applicazione attuale da sessione (se non c'è salva...) /// /// modulo di cui si testano i diritti /// public virtual DataLayer_AnagGen.CDCDataTable getEnabledCdc(string cod_modulo) { //init tabella DataLayer_AnagGen.CDCDataTable tabCdc = new DataLayer_AnagGen.CDCDataTable(); // cerco in sessione elenco CDC if (utils.obj.isInSessionObject("CdcEnabled4user4module")) { tabCdc = (DataLayer_AnagGen.CDCDataTable)utils.obj.objSessionObj("CdcEnabled4user4module"); } else { tabCdc = DataWrap.DW.taCdc.getEnabledCDC(utente, cod_modulo); utils.obj.setSessionVal("CdcEnabled4user4module", tabCdc); } return tabCdc; } /// /// conta il numero di permessi utente per la pagina attuale e restituisce true se ne trova almeno 1 /// /// /// public bool isPageEnabled(string pagina) { bool answ = false; try { System.Data.DataRow[] righe = permessi.Select(string.Format("URL = '{0}'", pagina)); answ = (righe.Length >= 1); } catch { } return answ; } /// /// verifica se il permesso utente per la pagina attuale sia write per almeno 1 diritto assegnato (restituisce true se ne trova almeno 1 con permessi2funzione.readwrite='S') /// /// /// public bool isPageWriteEnabled(string pagina) { bool answ = false; try { System.Data.DataRow[] righe = permessiWrite.Select(string.Format("URL = '{0}'", pagina)); answ = (righe.Length >= 1); } catch { } return answ; } /// /// LogOff utente con reset dati /// /// /// /// public bool logOffUtente() { bool risultato = false; clearAllUserData(); utente = ""; dominio = ""; risultato = true; return risultato; } /// /// retituisce il nome apgina dai permessi utente /// /// public string nomePaginaDaPermessi(string url) { string answ = ""; try { answ = permessi.Select(string.Format("URL = '{0}'", url))[0]["NOME"].ToString(); } catch { } return answ; } /// /// restituisce riga utente data la matricola... /// /// matricola /// public DataLayer_AnagGen.UTENTERow rigaUtenteDaMatricola(string matricola) { DataLayer_AnagGen.UTENTERow answ = null; try { answ = DataWrap.DW.taUtente.getByMatricola(matricola)[0]; } catch { } return answ; } /// /// toglier il diritto all'utente indicato /// /// /// /// /// /// /// public bool rimuoviDirittoUtente(string username, string cod_cdc, string cod_modulo, string cod_funzione) { bool answ = false; try { DataWrap.DW.taDiritti.DeleteQuery(username, cod_cdc, cod_modulo, cod_funzione); answ = true; } catch (Exception exc) { lg.Error($"Eccezione:{Environment.NewLine}{exc}"); } return answ; } /// /// Procedura da chiamare DOPO aver messo in session i dati utente/dominio x caricare gli altri dati /// /// /// /// public bool startUpUtente(string utenteAD) { bool risultato = false; clearAllUserData(); if (utenteAD != "") { char[] delimiters = new char[] { '\\' }; string[] datiUt = currUserAD.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); utente = datiUt[1]; dominio = datiUt[0]; setupRiga(); setupDirittiPermessi(); risultato = true; } return risultato; } /// /// calcola se l'utente abbia il diritto x la funzione indicata /// /// username formato AD /// codice modulo /// codice funzione /// public bool userHasRight(string utenteAD, string codModulo, string codFunzione) { bool answ = false; try { answ = utils.obj.taDiritti.getByUserModFun(utenteAD, codModulo, codFunzione).Rows.Count > 0; } catch { } return answ; } /// /// verifica nella tab diritti se l'utente abbia il right richiesto e fornisce bool in risposta /// /// /// public bool userHasRight(string diritto) { bool _answ = false; if (diritti.Select(String.Format("COD_FUNZIONE ='{0}'", diritto)).Length > 0) { _answ = true; } return _answ; } #endregion Public Methods } }