Table of Contents

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 in GlobalControllers/, le interfacce condivise in GlobalInterface/Identity/, e il registro .rem con cui il tier Business/ 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 su System.Web.Security.Membership.Provider (autenticazione, CRUD utenti, password). Aggiunge il filtro per tenancy.
  • InfocadRoleProvider — adapter server su System.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), restituendo GlobalSharedObjects.Permissions.UserSettings.
  • I tre *Controller sono proxy 1:1: risolvono l'oggetto remoto via DAOFactory e 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).
  • IInfocadRoleProviderAddUsersToRoles, CreateRole, CreateExRole, DeleteRole, DeleteExRole, FindUsersInRole, GetAllRoles(username) / GetAllRoles(tenancyID), GetRolesForUser, GetUsersInRole, IsUserInRole, ApplicationName. IInfocadRoleProviderExt estende IInfocadRoleProvider, IAuthorization (IInfocadRoleProviderExt.vb:8).
  • ILoginSettingsProvider (definito in IInfocadProfileProvider.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.InfocadLoginSettingsProvider e chiama ctrl.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_MembershipProviderActivator.GetObject(GetType(Identity.IInfocadMembershipProvider), CHANNEL://SERVERADDRESS/<Service_MembershipProvider>) (:76-77).
  • Ctrl_RoleProviderIInfocadRoleProvider / <Service_RoleProvider> (:79-80).
  • Ctrl_ProfileProviderILoginSettingsProvider / <Service_ProfileProvider> (:82-83).
  • Ctrl_LDAPILDAP / <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.rem sono anche gli endpoint su cui il Web tier CASSANDRA aggancia l'autenticazione: Global non ha .svc/.asmx propri 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 ASPNETInfocadMembershipProvider/InfocadRoleProvider delegano a Membership.Provider/Roles.Provider, cioè ai provider ASP.NET Oracle Membership/Role (OracleMembershipProvider/OracleRoleProvider) configurati sulla connessione OracleProvidersDB. Nessuna stored procedure applicativa Global qui.
  • Schema INFOCAD (INFOCAD_TEST38, MainConnection)InfocadLoginSettingsProvider persiste le impostazioni di login/profilo (contact, area, super-admin, utente CAD). Le procedure specifiche non sono state riverificate in questa pagina (i corpi Create/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 *ControllerActivator.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 Remoting Ctrl_* → .rem → DAO_*).
  • ./class-MObject-flow.md — catena UI → Controller → Remoting → DAO per gli oggetti (proxy 1:1 analogo ai *ProviderController).

Regole di business correlate

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 .rem per quell'host è UNKNOWN qui.

Debito tecnico

  • Disallineamento nome file vs nome classe (InfocadProfileProvider.vb contiene InfocadLoginSettingsProvider): 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 (classe MarshalByRefObject, 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 (classe InfocadLoginSettingsProvider Implements ILoginSettingsProvider).
  • InfocadServer/GlobalControllers/MemberShipProviderController.vb:9-17, RoleProviderController.vb:13-20, ProfileProviderController.vb:6-13 (proxy Inherits 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 (risoluzione Activator.GetObject per 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).