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 |
CONFLICTING — commentato 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:
SessionLogin—UserName,LastLoginDatee soprattuttoProviderUserKey(Guid). L'uso diProviderUserKeyè il tipico aggancio dell'ASP.NET Membership provider: da quiWebUser.LoadFromLogincarica il profilo applicativo dell'utente.SUPPORTED(WebUser.vb:68,72)SessionProfile—SuperAdmin(flag),Applications(set di applicazioni abilitate). Il flagRequestCenterEnabledè calcolato comeSessionProfile.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:
- Gate a livello di container —
Web.configdichiaraauthentication mode="Forms"conloginUrl="~/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) - Login — le pagine
userlogin.aspx.vb/webrequestlogin.aspx.vbpopolanoSession(...WebCommonSessionUser)invocandoWebUser.WebUserLoader(...)con ilNavigationSourceTypesopportuno (Cassandraper il portale interno,AutoTicketper l'ingresso diretto).SUPPORTED(userlogin.aspx.vb:20,22;webrequestlogin.aspx.vb:25,27) - Gate applicativo per pagina — ogni pagina RequestCenter estende
RequestCenterWeb.BaseClasses.RequestCenterPage(a sua voltaInherits Cassandra.InfocadSecurity.CassandraPage). InPage_PreInitricarica l'utente e nega l'accesso se non autenticato, seCurrentUser Is Nothing, o se nonRequestCenterEnablede nonIsUserSuperAdmin→Response.Redirect(DefaultUrl).VERIFIED(RequestCenterPage.vb:4,74,77,82; regola BR-REQ-001) - Edit-mode / privilegio — in
Page_Initil flag_isineditmodedipende dal ruolo (chi non èRoles.Usersentra in edit mode di default); inPage_PreInit_lowprivilegeuserè vero se il ruolo èRoles.UsersoRoles.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) — chiaviappSettingsassociate al modulo custom.SUPPORTED(CASSANDRA/Web.config:144–146) - L'identità applicativa vive in
HttpContext.Itemsper 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 classificateEnforcement: UI(es.BR-REQ-007/008/009/010validazione campi obbligatori e requisiti per call type;BR-REQ-026redirect). 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.configcommitta 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 inCASSANDRA/Web.config; valori mascherati inSEC-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 viaScriptManager.RegisterClientScriptBlock.VERIFIED(RequestCenterPage.vb:78–83) ClientSessionmancante inItems:WebUserLoaderreindirizza aFormsAuthentication.LoginUrl(o redirect client-side se callback).SUPPORTED(WebUser.vb:76–83)InfocadAuthenticationModulecommentato: nelWeb.configesaminato l'HttpModulecustom è disattivato (righe 636 e 1115 commentate); l'auth effettiva ricade sul Forms + popolamento diClientSessionfatto dalle pagine di login. Chi popolaHttpContext.Itemsquando il modulo è spento èconfig-dependente va confermato a runtime.CONFLICTING(CASSANDRA/Web.config:636,1115vsWebUser.vb:64)- SSO esterno fallito: gestito dalle pagine
login_bper/login_cute daAppError.aspx.SUPPORTED
Comportamento in locale (questo host)
- Verificabile read-only dallo schema
ASPNET_TEST38(Membership/Role) viapython-oracledbthin mode (.env, servicedev), sulle visteUSER_*.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.configesaminato (CASSANDRA/Web.config, profilo*_TEST38) è rappresentativo del profilo di sviluppo; i profili per-cliente possono attivareWebSSOe/o il modulo custom.INFERRED - L'uso di
ProviderUserKey (Guid)implica l'aggancio ad ASP.NET Membership; la conferma dello schemaORA_ASPNET_*come autoritativo è rinviata a runtime (OQ-4).SUPPORTED/UNKNOWN
Vedi anche
- Onboarding sviluppatore · Guide (panoramica)
- Debito tecnico (
TD-001,TD-006,TD-008,SEC-001) · Reperti prioritari - Integrazioni (SSO/WS per-cliente) · API SOAP/WCF
- Regole di business RequestCenter (BR-REQ) · FLOW-REQ-001 · Service Desk
- Reference codice: Request (BL) · RequestDAL
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.SUPPORTEDInfocadAuthenticationModuleregistrato 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à =
ClientSessioninHttpContext.Items;SessionProfile.SuperAdmin/Applications,SessionLogin.ProviderUserKey (Guid), ereditarietà daRequestCenter.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};WebSSOinCASSANDRA/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