Table of Contents

Sicurezza e autenticazione

Guida trasversale ai meccanismi di autenticazione, gestione dell'identità e autorizzazione della piattaforma Infocad, con seed sul verticale RequestCenter / Service Desk (batch DEV-1). Copre: fonti di identità, flusso di login, sessione, modello ruoli/permessi, dove i controlli sono applicati (frontend / backend / database) e — soprattutto — dove NON lo sono. Classificazione complessiva: catena UI→BL→DAL→proc VERIFIED; topologia di runtime reale (IIS, provider autoritativo) UNKNOWN (vedi OQ-2, OQ-4).

Important

Questa pagina è un rilievo di documentazione: il codice non è stato modificato. I controlli incoerenti descritti (regole solo-UI, grant non ri-verificati oltre WCF/Remoting) sono debito di sicurezza da confermare e triare col team — vedi Debito tecnico (TD-006, TD-008, SEC-001). Nessuna credenziale è riportata qui: i segreti in chiaro sono tracciati in forma mascherata sotto SEC-001.

Quadro d'insieme

Infocad ha uno stack di autenticazione duale e in transizione (TD-001, UNKNOWN quale sia autoritativo a runtime — OQ-4):

Meccanismo Dove Stato
ASP.NET Forms Authentication (authentication mode="Forms", deny users="?") web tier CASSANDRA VERIFIED attivo nel Web.config
ASP.NET Oracle Membership/Role providers (ORA_ASPNET_*, schema ASPNET) identità utente / ProviderUserKey SUPPORTED (uso di ProviderUserKey + CLAUDE.md)
OpenIddict / EF Core (tabelle in ASPNET_TEST38) tier moderno / net8 SUPPORTED presenza tabelle; ruolo runtime UNKNOWN
SSO esterno per-cliente ExternalAuth.<Customer> (WebSSO config) login federato VERIFIED a livello di contratto/config
Custom InfocadAuthenticationModule (Descor.Cassandra.InfocadSecurity) HttpModule CONFLICTINGcommentato nel Web.config esaminato

Fonti di identità

L'identità dell'utente autenticato è materializzata come Descor.Global.GlobalInterface.Identity.ClientSession, riposta in HttpContext.Current.Items con chiave Cassandra.WebSharedObject.SharedConstants.WebCommonSessionUser e riletta a ogni richiesta. SUPPORTED (WebUser.vb:64)

Da ClientSession derivano i due contenitori usati dal codice RequestCenter:

  • SessionLoginUserName, LastLoginDate e soprattutto ProviderUserKey (Guid). L'uso di ProviderUserKey è il tipico aggancio dell'ASP.NET Membership provider: da qui WebUser.LoadFromLogin carica il profilo applicativo dell'utente. SUPPORTED (WebUser.vb:68,72)
  • SessionProfileSuperAdmin (flag), Applications (set di applicazioni abilitate). Il flag RequestCenterEnabled è calcolato come SessionProfile.Applications.Contains(Applications.GetKeyForStrongName("RequestCenter")). SUPPORTED (WebUser.vb:67,71)

La classe web WebUser (RequestCenterWeb.HttpContextObjects.WebUser) eredita dal modello di dominio RequestCenter.UserPolicy.Users, quindi porta con sé ruolo (Role/IdRole), stato (IsActive, IsRoleActive) e le operazioni di dominio (SetLastLogin, SetLastLogin viene chiamato solo se IsActive And IsRoleActive). SUPPORTED (WebUser.vb:4,72–74)

Flusso di login (RequestCenter)

VERIFIED (catena config + code-behind concordanti)

flowchart TD
  A["Richiesta pagina protetta"] --> B{"authorization: deny users='?'"}
  B -- anonimo --> L["redirect a forms loginUrl (~/Default.aspx)"]
  B -- autenticato --> P["RequestCenterPage.Page_PreInit"]
  L --> U["userlogin.aspx / webrequestlogin.aspx"]
  U --> S["Session/Items = ClientSession (WebUserLoader)"]
  S --> P
  P --> G{"IsAuthenticated AND (RequestCenterEnabled OR IsUserSuperAdmin)?"}
  G -- no --> R["Response.Redirect(FormsAuthentication.DefaultUrl)"]
  G -- sì --> C["_lowprivilegeuser = Role in {Users, Viewer}"]
  C --> V["rendering pagina/controlli"]

Passi:

  1. Gate a livello di containerWeb.config dichiara authentication mode="Forms" con loginUrl="~/Default.aspx", defaultUrl="~/MainForm.aspx", slidingExpiration="true", protection="All", e <authorization><deny users="?"/></authorization> (anonimo negato di default; le sotto-cartelle riaprono con <allow users="?">/<allow users="*"> mirati). VERIFIED (CASSANDRA/Web.config:841–845)
  2. Login — le pagine userlogin.aspx.vb / webrequestlogin.aspx.vb popolano Session(...WebCommonSessionUser) invocando WebUser.WebUserLoader(...) con il NavigationSourceTypes opportuno (Cassandra per il portale interno, AutoTicket per l'ingresso diretto). SUPPORTED (userlogin.aspx.vb:20,22; webrequestlogin.aspx.vb:25,27)
  3. Gate applicativo per pagina — ogni pagina RequestCenter estende RequestCenterWeb.BaseClasses.RequestCenterPage (a sua volta Inherits Cassandra.InfocadSecurity.CassandraPage). In Page_PreInit ricarica l'utente e nega l'accesso se non autenticato, se CurrentUser Is Nothing, o se non RequestCenterEnabled e non IsUserSuperAdminResponse.Redirect(DefaultUrl). VERIFIED (RequestCenterPage.vb:4,74,77,82; regola BR-REQ-001)
  4. Edit-mode / privilegio — in Page_Init il flag _isineditmode dipende dal ruolo (chi non è Roles.Users entra in edit mode di default); in Page_PreInit _lowprivilegeuser è vero se il ruolo è Roles.Users o Roles.Viewer. SUPPORTED (RequestCenterPage.vb:56–70,86–88)

Sessione

  • sessionState mode="InProc" — sessione in-process (non out-of-process/SQL). SUPPORTED (CASSANDRA/Web.config:569)
  • Cookie di autenticazione configurato (InfocadAuthentication.Cookie.Name = .CUSTOM_AUTH, ...Cookie.Timeout = 30, ...LoginUrl = /Default.aspx) — chiavi appSettings associate al modulo custom. SUPPORTED (CASSANDRA/Web.config:144–146)
  • L'identità applicativa vive in HttpContext.Items per richiesta (ClientSession), oltre al ticket Forms. SUPPORTED (WebUser.vb:64)

Modello ruoli / permessi

VERIFIED (costanti + uso)

I ruoli RequestCenter sono GUID hard-coded in RequestCenter.Constants.Roles (RequestCenter/Constants/Constants.vb:26–37):

Costante Nota
Users, Viewer profili a basso privilegio (_lowprivilegeuser)
FM, Supervisor, ServiceManager, TechnicalChief profili gestionali (Supervisor = ServiceManager, stesso GUID)
CallCenterOperator, CallCenterManager call center
Maintenance, OnlyAssigned manutenzione / visibilità ristretta

Oltre al ruolo, l'autorizzazione dipende da: il flag applicativo RequestCenterEnabled, il flag globale IsUserSuperAdmin (bypassa il gate applicativo), e — a livello di dominio — l'associazione ruolo ⇄ call type con attività di creazione nel workflow (BR-REQ-002). VERIFIED

SSO esterno per-cliente

VERIFIED (contratto + implementazioni)

L'SSO federato è pluggabile: il contratto è ExternalAuth.Interface (progetto C#), con IAuthManager.Authenticate(ref IAuthInfo) / Authenticate(ref IAuthInfo, HttpRequest) e IAuthInfo come sacchetto di proprietà (GetProperty/SetProperty/GetPropertyXml). SUPPORTED (Customizations/ExternalAuth.Interface/IAuthManager.cs:8–27, IAuthInfo.cs:8–27)

Implementazioni per cliente: ExternalAuth.BPER (AuthManager.cs/AuthInfo.cs, WS SOAP NetBperAbil.dll), CustomAuth.CUT (WS FpgCutService.wsdl). Le pagine di ingresso sono CASSANDRA/Authentication/ExternalAuth/login_bper.aspx, login_cut.aspx. La configurazione è la sezione WebSSO (Enabled, LoginMode, AuthenticateMode, nodi di mapping UsernameNode=CODICE_PERSONA, RolesNode=PROFILES, CompanyNode=ID_DITTA, SuperAdminValue, …) e la ConfigurationSection Descor.Cassandra.Configuration.ExternalAuthSettings (Enabled, SSOMode, LDAPRoot, WSUrl, …). SUPPORTED (CASSANDRA/Web.config:500,511; ExternalAuthConfiguration.cs:31–91)

Nel Web.config esaminato WebSSO Enabled="False" (SSO disattivo in quel profilo). SUPPORTED (CASSANDRA/Web.config:511)

Dove sono applicati i controlli

Traceability: Ruolo/permesso → visibilità frontend → autorizzazione endpoint → controllo di servizio → comportamento DB

Livello Controllo RequestCenter Applicato? Evidenza
Ruolo/permesso GUID ruolo + RequestCenterEnabled + IsUserSuperAdmin + mappa ruolo⇄call type sì (fonte dati) Constants.vb:26; WebUser.vb:67,71
Visibilità frontend gate pagina Page_PreInit; edit-mode/basso-privilegio; selettori filtrati per ruolo sì (solo UI) RequestCenterPage.vb:74–88; BR-REQ-002
Autorizzazione endpoint WCF: If ValidateLoginKey(loginkey) prima dell'operazione parziale ExtraFlowActionsProxy.svc.vb:13,56,64; BR-REQ-027
Controllo di servizio (BL) Request.Create e setter di dominio non ri-verificano ruolo/grant no RequestCenter/Classes/Request.vb (entry condiviso); BR-REQ-001 nota rischio
Comportamento database package GESTREQUEST/GESTREQUEST_T2: nessuna verifica di ruolo applicativo (operano su PIDUSER/PIDTENANT passati) no RequestDAL.vb:5078,5105; schema REQUESTCENTER_TEST38

Interpretazione: l'autenticazione (chi sei) è verificata sia dalla UI (Page_PreInit) sia dal canale WCF (ValidateLoginKey); l'autorizzazione fine (cosa puoi fare) è invece garantita in larga parte dal solo frontend. L'entry point BL Request.Create è condiviso da portale, WCF e helper, e non ri-controlla il grant: l'autorizzazione va assicurata a monte da ciascun canale. VERIFIED (BR-REQ-001 nota rischio)

⚠️ Controlli incoerenti (rilievi di sicurezza)

  • TD-006 — regole applicate solo lato UI. Molte validazioni RequestCenter sono classificate Enforcement: UI (es. BR-REQ-007/008/009/010 validazione campi obbligatori e requisiti per call type; BR-REQ-026 redirect). Non essendo ripetute nell'entry point BL/WCF condiviso, sono bypassabili chiamando la BL o il servizio direttamente. SUPPORTED (TD-006, BR-REQ)
  • TD-008 — grant UI non ri-verificati oltre il confine WCF/.NET Remoting. I grant di sezione sono valutati solo lato UI; i servizi BL raggiunti via .NET Remoting/WCF non ri-verificano il grant → un chiamante server-side o un'integrazione può eseguire operazioni riservate. Pattern sistemico su 9 domini (Census, QualityCheck, BulkLoader, Check, Report, Document, ExportService, Project, Global); RequestCenter condivide la stessa forma architetturale (entry BL condiviso senza ri-check). SUPPORTED (TD-008, Reperti prioritari)
  • SEC-001 — credenziali Oracle in chiaro. CASSANDRA/Web.config committa connection string con password in chiaro (+ molte varianti d'ambiente commentate). Persistono nella storia Git. Non riportate qui. VERIFIED (SEC-001)

Impersonation

UNKNOWN. Non è stato trovato nel verticale RequestCenter un meccanismo esplicito di impersonation (nessun WindowsIdentity.Impersonate, nessun identity impersonate="true" nei config esaminati). Il flag IsUserSuperAdmin è un bypass di autorizzazione, non un'impersonazione di un altro utente. Da confermare col team se esistano flussi "agisci come" in altri domini.

Service account

  • Connessione al DB: le app web si connettono a Oracle con un utente di schema tecnico (es. REQUESTCENTER_*, INFOCAD_*, DEM_*), non con l'identità dell'utente finale: l'identità applicativa vive sopra (Membership + ClientSession), l'accesso ai dati passa dal service account dello schema. SUPPORTED (connection string per-ambiente in CASSANDRA/Web.config; valori mascherati in SEC-001)
  • Windows Services (InfocadServer): girano come processi Windows; l'account di servizio in ambiente reale è UNKNOWN (vedi OQ-2).

Failure modes

  • Non autenticato / non abilitato: redirect a FormsAuthentication.DefaultUrl; se richiesta è callback, redirect lato client via ScriptManager.RegisterClientScriptBlock. VERIFIED (RequestCenterPage.vb:78–83)
  • ClientSession mancante in Items: WebUserLoader reindirizza a FormsAuthentication.LoginUrl (o redirect client-side se callback). SUPPORTED (WebUser.vb:76–83)
  • InfocadAuthenticationModule commentato: nel Web.config esaminato l'HttpModule custom è disattivato (righe 636 e 1115 commentate); l'auth effettiva ricade sul Forms + popolamento di ClientSession fatto dalle pagine di login. Chi popola HttpContext.Items quando il modulo è spento è config-dependent e va confermato a runtime. CONFLICTING (CASSANDRA/Web.config:636,1115 vs WebUser.vb:64)
  • SSO esterno fallito: gestito dalle pagine login_bper/login_cut e da AppError.aspx. SUPPORTED

Comportamento in locale (questo host)

  • Verificabile read-only dallo schema ASPNET_TEST38 (Membership/Role) via python-oracledb thin mode (.env, service dev), sulle viste USER_*. VERIFIED (toolchain doc)
  • Non verificabile qui: quale provider è autoritativo a runtime (Oracle Membership vs OpenIddict), topologia IIS, account di servizio, comportamento del cookie .CUSTOM_AUTH. Richiedono Windows/ambiente reale. UNKNOWN (OQ-2, OQ-4)
  • I comandi Windows/msbuild/IIS sono NON verificati su macOS senza Oracle Client.

Assunzioni

  • Il Web.config esaminato (CASSANDRA/Web.config, profilo *_TEST38) è rappresentativo del profilo di sviluppo; i profili per-cliente possono attivare WebSSO e/o il modulo custom. INFERRED
  • L'uso di ProviderUserKey (Guid) implica l'aggancio ad ASP.NET Membership; la conferma dello schema ORA_ASPNET_* come autoritativo è rinviata a runtime (OQ-4). SUPPORTED/UNKNOWN

Vedi anche

Evidenze

  • Forms auth + deny users="?" + login/default URL: InfocadWeb/WebMachine/CASSANDRA/Web.config:841–845. VERIFIED
  • sessionState InProc; cookie custom (.CUSTOM_AUTH, timeout 30, LoginUrl): CASSANDRA/Web.config:569,144–146. SUPPORTED
  • InfocadAuthenticationModule registrato ma commentato: CASSANDRA/Web.config:636,1115. CONFLICTING
  • Gate pagina RequestCenter (Page_PreInit, RequestCenterEnabled/IsUserSuperAdmin, redirect DefaultUrl): CASSANDRA/CommonWeb/RequestCenter/Classes/Base/RequestCenterPage.vb:4,56–70,74,77,82,86–88. VERIFIED
  • Identità = ClientSession in HttpContext.Items; SessionProfile.SuperAdmin/Applications, SessionLogin.ProviderUserKey (Guid), ereditarietà da RequestCenter.UserPolicy.Users: CASSANDRA/CommonWeb/RequestCenter/Classes/HttpContext/WebUser.vb:4,64,67–74. SUPPORTED
  • Ingresso login RequestCenter: CASSANDRA/RequestCenterWeb/userlogin.aspx.vb:12,20,22; webrequestlogin.aspx.vb:25,27. SUPPORTED
  • Ruoli GUID hard-coded: RequestCenter/Constants/Constants.vb:26–37. VERIFIED
  • Gate WCF ValidateLoginKey: CASSANDRA/RequestCenterWeb/WebServices/ExtraFlowActionsProxy.svc.vb:13,56,64. VERIFIED
  • SSO esterno: Customizations/ExternalAuth.Interface/IAuthManager.cs:8–27, IAuthInfo.cs:8–27; Customizations/ExternalAuth.BPER/*, Customizations/CustomAuth.CUT/*; CASSANDRA/Authentication/ExternalAuth/{login_bper.aspx,login_cut.aspx,ExternalAuthConfiguration.cs:31–91}; WebSSO in CASSANDRA/Web.config:500,511. SUPPORTED
  • Entry BL condiviso senza ri-check autorizzazione; DAL invoca package con PIDUSER/PIDTENANT: RequestCenter/Classes/Request.vb; RequestCenter.DAL.OracleODP/RequestDAL.vb:5078,5105. VERIFIED
  • Rilievi trasversali: docs/14-technical-debt/index.md (TD-001,TD-006,TD-008,SEC-001), docs/14-technical-debt/reperti-prioritari.md; docs/08-business-rules/BR-REQ.md:15,26–27,61–64. VERIFIED
  • Stack duale / provider autoritativo / topologia: docs/_state/open-questions.md (OQ-2, OQ-4). UNKNOWN