Esiste qualcosa come un evento OnClientConnected per il servizio remoto .NET?
-
05-07-2019 - |
Domanda
Sto usando qualcosa del genere sul mio server:
TcpServerChannel channel = new TcpServerChannel(settings.RemotingPort);
ChannelServices.RegisterChannel(channel, true);
RemotingServices.Marshal(myRemoteObject, "myRemoteObject");
Vorrei iscrivermi a un tipo di evento in modo che ogni volta che un client remoto si connette a myRemoteObject, posso controllare Thread.CurrentPrincipal.Identity.Name per decidere se autorizzarlo.
Attualmente sto eseguendo il controllo di autorizzazione in ogni metodo remoto esposto di myRemoteObject che è un casino ...
Soluzione
Nella mia applicazione remota ho definito un oggetto / interfaccia speciale in cui i client devono prima autorizzare. Quindi restituisce l'oggetto speciale, se il client ha autorizzato correttamente l'oggetto remoto. Quindi hai l'autorizzazione in un unico posto.
Sembra qualcosa del genere.
public interface IPortal
{
object SignIn(string name, string password);
}
public class Portal : MarshalByRefObject, IPortal
{
private object _remoteObject;
public Portal() {
_remoteObject = new RemoteObject();
}
public object SignIn(string name, string password)
{
// Authorization
// return your remote object
return _remoteObject;
}
}
Nella tua applicazione ospiti Portal-Object
TcpServerChannel channel = new TcpServerChannel(settings.RemotingPort);
ChannelServices.RegisterChannel(channel, true);
Portal portal = new Portal()
RemotingServices.Marshal(portal , "portal");
Altri suggerimenti
Potresti usare qualcosa come PostSharp per fattorizzare il controllo da ogni metodo - basta farlo nel Consiglio AOP. (Lo applichi alla classe che sta esponendo i suoi metodi, non alla connessione client.)
Questo approccio è indipendente dal trasporto che utilizzi per il remoting - elimina semplicemente la preoccupazione trasversale dell'autorizzazione in tutti i metodi della tua classe remotata.