Identity provider e infrastruttura .NET Remoting (dominio Global)
Provider di identità (membership / role / login-settings) ospitati server-side in
GlobalManager/Identity/, i loro wrapper client inGlobalControllers/, le interfacce condivise inGlobalInterface/Identity/, e il registro.remcon cui il tierBusiness/li pubblica come oggetti well-known SingleCall sui canali .NET Remoting.Descor.Global.GlobalManager.Identity/Descor.Global.GlobalControllers/Descor.Global.GlobalInterface.Identity. Classificazione complessiva: VERIFIED.
Scopo
Il dominio Global espone l'identità della piattaforma (autenticazione, autorizzazione per ruoli, impostazioni di login/profilo) come servizi remoti. A differenza degli altri verticali Global (che seguono lo stile DAO_* → Ctrl_* su .rem), l'identità non incapsula stored procedure applicative RPS_* proprie: i provider server-side sono adapter attorno all'infrastruttura ASP.NET Membership/Role (System.Web.Security) configurata con i provider Oracle sullo schema ASPNET, arricchiti con il filtro di multi-commessa (tenancy). Vedi Autenticazione e sicurezza.
Namespace e progetto
| Ruolo | Progetto | File / tipo |
|---|---|---|
| Interfacce condivise | GlobalInterface |
GlobalInterface/Identity/IInfocadMembershipProvider.vb, IInfocadRoleProvider.vb (+ IInfocadRoleProviderExt), IInfocadProfileProvider.vb (contiene ILoginSettingsProvider) |
| Implementazione server (DAO) | GlobalManager |
GlobalManager/Identity/InfocadMembershipProvider.vb, InfocadRoleProvider.vb, InfocadProfileProvider.vb |
| Wrapper client (proxy Remoting) | GlobalControllers |
GlobalControllers/MemberShipProviderController.vb, RoleProviderController.vb, ProfileProviderController.vb |
| Composition root (host) | Business (progetto server eseguibile) |
Business/Start.vb, Business/StartIEM.vb, Business/StartECM.vb |
Important
Nome file ≠ nome classe. Il file GlobalManager/Identity/InfocadProfileProvider.vb:15 definisce la classe InfocadLoginSettingsProvider (implementa ILoginSettingsProvider); non esiste una classe InfocadProfileProvider. È questa classe che viene registrata sul .rem ProfileProvider.rem. Classificazione VERIFIED.
Responsabilità
InfocadMembershipProvider— adapter server suSystem.Web.Security.Membership.Provider(autenticazione, CRUD utenti, password). Aggiunge il filtro per tenancy.InfocadRoleProvider— adapter server suSystem.Web.Security.Roles.Provider(ruoli e appartenenze). Aggiunge il filtro per tenancy e i ruoli "esterni" (CreateExRole/DeleteExRole).InfocadLoginSettingsProvider— impostazioni di login/profilo utente (Create/Update/Delete/LoadBy*, elenco ruoli, area, utente CAD), restituendoGlobalSharedObjects.Permissions.UserSettings.- I tre
*Controllersono proxy 1:1: risolvono l'oggetto remoto viaDAOFactorye inoltrano ogni chiamata (stessa firma dell'interfaccia). Nessuna logica aggiuntiva. Coerente con lo stile MANAGER del dominio (Controllers = proxy Remoting).
Perché esiste
UNKNOWN (motivazione non documentata nel codice). L'evidenza mostra cosa fa il layer (adapter Remoting su ASP.NET Membership), non perché sia stato scelto questo disegno.
Contratto pubblico
Interfacce (GlobalInterface/Identity/)
IInfocadMembershipProvider— superficie membership (es.ChangePassword,CreateUser,DeleteUser,FindUsersByEmail,FindUsersByName,GetAllUsers(tenancyID,…)e overload per username,GetNumberOfUsersOnline,GetPassword,GetUser, proprietàApplicationName,EnablePasswordReset,EnablePasswordRetrieval).IInfocadRoleProvider—AddUsersToRoles,CreateRole,CreateExRole,DeleteRole,DeleteExRole,FindUsersInRole,GetAllRoles(username)/GetAllRoles(tenancyID),GetRolesForUser,GetUsersInRole,IsUserInRole,ApplicationName.IInfocadRoleProviderExtestendeIInfocadRoleProvider, IAuthorization(IInfocadRoleProviderExt.vb:8).ILoginSettingsProvider(definito inIInfocadProfileProvider.vb) —Create,Update,Delete,LoadByIdContact,LoadByIdLogin,LoadByUsername,LoadByCADUserName,GetContactIDListByLoginIDList,ListRoles,UpdateArea,UpdateCadUser.
Implementazioni o classi derivate
| Interfaccia | Server (GlobalManager/Identity/) |
Client proxy (GlobalControllers/) |
|---|---|---|
IInfocadMembershipProvider |
InfocadMembershipProvider (Inherits MarshalByRefObject, :12-14) |
MemberShipProviderController (Inherits Ctrl_Base, :9-11) |
IInfocadRoleProviderExt (⊃ IInfocadRoleProvider) |
InfocadRoleProvider (Implements IInfocadRoleProviderExt, :10-12) |
RoleProviderController (Implements IInfocadRoleProvider, :13-15) |
ILoginSettingsProvider |
InfocadLoginSettingsProvider (InfocadProfileProvider.vb:15-17) |
ProfileProviderController (Implements ILoginSettingsProvider, :6-8) |
Tutte le classi server derivano da MarshalByRefObject (requisito per l'attivazione Remoting well-known). Classificazione VERIFIED.
Dipendenze
- Server:
System.Web.Security(Membership.Provider,Roles.Provider,MembershipUser,MembershipCreateStatus),Descor.Infrastructure.LogManager(logging eccezioni),GlobalSharedObjects.Permissions.UserSettings. - Client:
Ctrl_Base(GlobalControllers/serv/Ctrl_Base.vb),DAOFactory(GlobalControllers/serv/DAOFactory.vb),My.Resources.ServicesDictionary(nomi.rem),Descor.Common.Configuration.SettingsManager(CHANNEL,SERVERADDRESS). - Host:
System.Runtime.Remoting(RemotingConfiguration.RegisterWellKnownServiceType,ChannelServices.RegisterChannel,TcpChannel,IpcChannel).
Ciclo di vita
Oggetti well-known SingleCall: il server crea una nuova istanza per ogni chiamata e la rilascia al ritorno; nessuno stato conservato tra chiamate. Il costruttore di InfocadMembershipProvider cattura provider = Membership.Provider (:17-18), quello di InfocadRoleProvider cattura provider = Roles.Provider (:18-19) ad ogni attivazione.
Metodi principali
InfocadMembershipProvider.CreateUser — creazione utente + settings di login
Anchor: GlobalManager/Identity/InfocadMembershipProvider.vb:41.
- Delega a
provider.CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, status)(il provider ASP.NET Oracle sullo schema ASPNET). - Se l'utente è creato, istanzia in-process
Identity.InfocadLoginSettingsProvidere chiamactrl.Create(mu.ProviderUserKey, 0, 0, False, isExternal)per allineare le impostazioni di login (:47-49). - Eccezioni: log via
Descor.Infrastructure.LogManager.ExceptionLogger.LogException(ex)e re-throw (:52-54).
Questo è il collante tra le due metà dell'identità: Membership ASP.NET (schema ASPNET) e le login-settings Global. Classificazione VERIFIED.
Filtro tenancy (metodi privati)
getTenanyUsers(tenancyID) / getTenancyUsers(username) (InfocadMembershipProvider.vb:155/177) e getTenanyRoles(tenancyID) / getTenanyRoles(username) (InfocadRoleProvider.vb:197/219) restringono utenti/ruoli alla commessa corrente prima di comporre i risultati degli overload GetAllUsers(tenancyID,…) / GetAllRoles(tenancyID). Classificazione SUPPORTED (una evidenza; corpo non riletto integralmente).
Proxy client (esempio rappresentativo)
MemberShipProviderController.New chiama Me.DaoActivate(enControllers.Ctrl_MembershipProvider) (:17); ogni membro implementa l'omonimo dell'interfaccia inoltrando all'oggetto remoto risolto. Analoghi: RoleProviderController.New → DaoActivate(enControllers.Ctrl_RoleProvider) (:20), ProfileProviderController.New → DaoActivate(enControllers.Ctrl_ProfileProvider) (:13). Metodi banali (inoltro 1:1) non documentati singolarmente.
Collaborazioni — risoluzione dell'endpoint (client)
DAOFactory (GlobalControllers/serv/DAOFactory.vb) mappa la costante enControllers all'oggetto remoto:
Ctrl_MembershipProvider→Activator.GetObject(GetType(Identity.IInfocadMembershipProvider), CHANNEL://SERVERADDRESS/<Service_MembershipProvider>)(:76-77).Ctrl_RoleProvider→IInfocadRoleProvider/<Service_RoleProvider>(:79-80).Ctrl_ProfileProvider→ILoginSettingsProvider/<Service_ProfileProvider>(:82-83).Ctrl_LDAP→ILDAP/<Service_LDAP>(:85-86),LDAPServerHelper(:88-89).
I nomi .rem provengono da GlobalControllers/serv/ServicesDictionary.resx (Service_MembershipProvider → MembershipProvider.rem, Service_RoleProvider → RoleProvider.rem, Service_ProfileProvider → ProfileProvider.rem, Service_LDAP → LDAP.rem). CHANNEL e SERVERADDRESS sono letti da Descor.Common.Configuration.SettingsManager (config app, chiave SSO_CHANNEL per lo schema del canale). Classificazione VERIFIED.
Registrazione lato server — registro .rem del dominio Global
Il tier Business/ pubblica i tipi server come well-known SingleCall all'avvio del servizio Windows. Esiste una REGISTRAZIONE DUALE su tre composition root distinti (Start.vb, StartIEM.vb, StartECM.vb): i tre provider di identità compaiono in almeno due host, con lo stesso nome .rem, ma catalogo di servizi Global diverso per host.
Business/StartIEM.vb (host IEM)
| Riga | Tipo server | Endpoint .rem |
|---|---|---|
:239 |
Identity.InfocadMembershipProvider |
MembershipProvider.rem |
:243 |
Identity.InfocadRoleProvider |
RoleProvider.rem |
:247 |
Identity.InfocadLoginSettingsProvider |
ProfileProvider.rem |
:251 |
Identity.LDAPHelper |
LDAP.rem |
:255 |
Identity.LDAPServerHelper |
LDAPServerHelper.rem |
:259 |
DAO.DAO_Settings |
DAO_Settings.rem |
:263 |
Mail.MailSender |
DAO_Mail.rem |
:271 |
DAO.DAO_Tenancy |
DAO_Tenancy.rem |
:275 |
DAO.DAO_Search |
DAO_Search.rem |
Business/Start.vb (host InfocadServer principale)
| Riga | Tipo server | Endpoint .rem |
|---|---|---|
:293 |
Identity.InfocadMembershipProvider |
MembershipProvider.rem |
:297 |
Identity.InfocadRoleProvider |
RoleProvider.rem |
:301 |
Identity.InfocadLoginSettingsProvider |
ProfileProvider.rem |
:305 |
Identity.LDAPHelper |
LDAP.rem |
:317 |
DAO.DAO_Company |
DAO_Companies.rem |
:330 |
DAO.DAO_Contact |
DAO_Contacts.rem |
:342 |
DAO.DAO_MObject |
DAO_Objects.rem |
StartECM.vb è il terzo host. La sovrapposizione dei tre provider di identità su più host è coerente con il fatto che ciascun servizio Windows (InfocadServer, IEMServer, ECMServer) deve poter autenticare/autorizzare autonomamente. Classificazione VERIFIED (righe confermate per Start.vb/StartIEM.vb).
MembershipProvider.rem/RoleProvider.rem/ProfileProvider.remsono anche gli endpoint su cui il Web tier CASSANDRA aggancia l'autenticazione: Global non ha.svc/.asmxpropri e comunica con il server 100% via .NET Remoting.
Canali Remoting (Tcp / IPC)
Business/Start.vb registra due canali all'avvio:
TcpChannel(tcpChannelProperties, Nothing, serverProvider)→ChannelServices.RegisterChannel(MyTcpChannel, True)(:225-226) — comunicazione cross-machine (web ⇄ server).IpcChannel(ipcChannelProperties, Nothing, New BinaryServerFormatterSinkProvider)→ChannelServices.RegisterChannel(MyIPCChannel, False)(:233-235) — comunicazione intra-host (named pipe).
Lo schema effettivamente usato dal client è deciso da SettingsManager.CHANNEL (config SSO_CHANNEL), quindi lo stesso oggetto well-known è raggiungibile su tcp:// o ipc:// a seconda del deployment. Classificazione VERIFIED.
Accesso al database
Indiretto e su due schemi distinti:
- Schema ASPNET —
InfocadMembershipProvider/InfocadRoleProviderdelegano aMembership.Provider/Roles.Provider, cioè ai provider ASP.NET Oracle Membership/Role (OracleMembershipProvider/OracleRoleProvider) configurati sulla connessioneOracleProvidersDB. Nessuna stored procedure applicativa Global qui. - Schema INFOCAD (INFOCAD_TEST38,
MainConnection) —InfocadLoginSettingsProviderpersiste le impostazioni di login/profilo (contact, area, super-admin, utente CAD). Le procedure specifiche non sono state riverificate in questa pagina (i corpiCreate/Update/LoadBy*non riletti integralmente): classificazione INFERRED sul dettaglio delle procedure.
Nessun accesso OracleConnection inline nei provider di identità (coerente con la centralizzazione DAL del prodotto).
Autorizzazione
IInfocadRoleProviderExt estende IAuthorization (IInfocadRoleProviderExt.vb:8), quindi la superficie ruoli è anche il punto delle verifiche di autorizzazione lato dominio. Nota trasversale al dominio Global: la scrittura sugli oggetti (MObject) applica il grant solo in UI, non nel DAO server né nel controller (vedi BR-GLB-017 / TD-008 e ./class-MObject-flow.md). Questo non è provato equivalente per l'identità e non viene esteso qui.
Gestione degli errori
Pattern osservato nei provider server: Try … Catch ex con Descor.Infrastructure.LogManager.ExceptionLogger.LogException(ex) seguito da Throw (re-throw verso il client Remoting). Esempio: InfocadMembershipProvider.CreateUser:52-54. Classificazione SUPPORTED.
Thread safety
L'attivazione SingleCall dà una istanza per chiamata (nessuno stato condiviso a livello di istanza). Lo stato condiviso reale è nei provider ASP.NET sottostanti (Membership.Provider/Roles.Provider, statici di processo) e nel DB. Non sono presenti lock espliciti nei provider Global. Classificazione INFERRED.
Considerazioni sulle prestazioni
Ogni chiamata client attraversa: proxy *Controller → Activator.GetObject (transparent proxy, risoluzione URL) → canale Tcp/IPC → nuova istanza server → provider ASP.NET → DB. Il canale IPC evita lo stack TCP quando web e server coabitano sull'host. Nessuna misura disponibile.
Esempio di utilizzo
Verificato staticamente (non eseguito). Uso tipico lato client (Web tier CASSANDRA o altri controller):
Dim membership As New Descor.Global.GlobalControllers.MemberShipProviderController()
Dim status As System.Web.Security.MembershipCreateStatus
Dim mu = membership.CreateUser(userName, password, email, question, answer, True, Nothing, status)
Il controller inoltra a MembershipProvider.rem sul canale configurato; il server crea l'utente sullo schema ASPNET e allinea le login-settings.
Test correlati
Nessun test automatico presente nel repository (0 test): copertura non misurata.
Flussi correlati
- FLOW-GLB-001 — inserimento
MObject(stessa infrastruttura RemotingCtrl_* → .rem → DAO_*). ./class-MObject-flow.md— catena UI → Controller → Remoting → DAO per gli oggetti (proxy 1:1 analogo ai*ProviderController).
Regole di business correlate
- Contesto di sicurezza/grant del dominio Global: reperti prioritari (TD-008).
Limitazioni
- I corpi di
InfocadLoginSettingsProvider.Create/Update/LoadBy*non sono stati riletti integralmente: le stored procedure e le tabelle precise sono INFERRED. StartECM.vb(terzo host) non è stato ispezionato riga per riga in questa pagina; l'elenco.remper quell'host è UNKNOWN qui.
Debito tecnico
- Disallineamento nome file vs nome classe (
InfocadProfileProvider.vbcontieneInfocadLoginSettingsProvider): fonte di confusione in navigazione/manutenzione. - Registrazione duale/tripla degli stessi endpoint su più composition root senza una sorgente unica: rischio di drift tra host (un provider aggiunto in un solo
Start*.vb).
Operazioni
Avvio/pubblicazione degli endpoint di identità come parte dei servizi Windows (InfocadServer/IEMServer/ECMServer); dettagli deployment e restart in Operations.
Evidenze
InfocadServer/GlobalManager/Identity/InfocadMembershipProvider.vb:12-18(classeMarshalByRefObject,provider = Membership.Provider),:41-54(CreateUser+ login-settings + log/re-throw),:155/177(filtro tenancy).InfocadServer/GlobalManager/Identity/InfocadRoleProvider.vb:10-19(Implements IInfocadRoleProviderExt,provider = Roles.Provider),:197/219(filtro tenancy ruoli).InfocadServer/GlobalManager/Identity/InfocadProfileProvider.vb:15-17(classeInfocadLoginSettingsProvider Implements ILoginSettingsProvider).InfocadServer/GlobalControllers/MemberShipProviderController.vb:9-17,RoleProviderController.vb:13-20,ProfileProviderController.vb:6-13(proxyInherits Ctrl_Base+DaoActivate(enControllers.*)).InfocadServer/GlobalInterface/Identity/IInfocadMembershipProvider.vb:8,IInfocadRoleProvider.vb:8,IInfocadRoleProviderExt.vb:7-8(Inherits IInfocadRoleProvider, IAuthorization),IInfocadProfileProvider.vb(Interface ILoginSettingsProvider).InfocadServer/GlobalControllers/serv/DAOFactory.vb:76-77/79-80/82-83/85-86/88-89(risoluzioneActivator.GetObjectper Membership/Role/Profile/LDAP).InfocadServer/GlobalControllers/serv/ServicesDictionary.resx(MembershipProvider.rem,RoleProvider.rem,ProfileProvider.rem,LDAP.rem).InfocadServer/Business/StartIEM.vb:239/243/247/251/255/259/263/271/275(registrazione well-known SingleCall, host IEM).InfocadServer/Business/Start.vb:293/297/301/305/317/330/342(registrazione host principale) e:225-226/233-235(TcpChannel+IpcChannel,RegisterChannel).InfocadServer/Business/StartECM.vb(terzo host — esistenza verificata, contenuto non ispezionato in dettaglio qui).