Linguaggio
Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Impersonazione è una tecnica comune usata dai servizi per limitare l'accesso dei client alle risorse di un dominio del servizio. Le risorse del dominio del servizio possono essere risorse del computer, ad esempio file locali (rappresentazione) o una risorsa in un altro computer, ad esempio una condivisione file (delega). Per un'applicazione di esempio, vedere Impersonificazione del client. Per un esempio di come utilizzare l'impersonazione, vedere Procedura: Impersonare un client su un servizio.
Importante
Tenere presente che quando si rappresenta un client in un servizio, il servizio viene eseguito con le credenziali del client, che possono avere privilegi più elevati rispetto al processo del server.
Informazioni generali
In genere, i client chiamano un servizio per fare in modo che il servizio esegua un'azione per conto del client. L'impersonificazione consente al servizio di agire come il client durante l'esecuzione dell'azione. La delega consente a un servizio front-end di inoltrare la richiesta del client a un servizio back-end in modo che il servizio back-end possa rappresentare anche il client. La rappresentazione viene usata più comunemente come metodo per verificare se un client è autorizzato a eseguire una determinata azione, mentre la delega è un modo per scorrere le funzionalità di rappresentazione, insieme all'identità del client, a un servizio back-end. La delega è una funzionalità di dominio di Windows che può essere usata quando viene eseguita l'autenticazione basata su Kerberos. La delega è distinta dal flusso di identità e, poiché la delega trasferisce la possibilità di rappresentare il client senza possesso della password del client, è un'operazione con privilegi molto più elevata rispetto al flusso di identità.
Sia la rappresentazione che la delega richiedono che il client abbia un'identità di Windows. Se un client non possiede un'identità di Windows, l'unica opzione disponibile consiste nel propagare l'identità del client al secondo servizio.
Nozioni di base sull'impersonificazione
Windows Communication Foundation (WCF) supporta l'impersonificazione per un'ampia gamma di credenziali client. In questo argomento viene descritto il supporto del modello di servizio per la rappresentazione del chiamante durante l'implementazione di un metodo di servizio. Sono discussi anche scenari di distribuzione comuni che coinvolgono l'impersonificazione e la sicurezza SOAP e le opzioni WCF in tali scenari.
Questo argomento è incentrato sulla rappresentazione e la delega in WCF quando si usa la sicurezza SOAP. È anche possibile usare la rappresentazione e la delega con WCF quando si usa la sicurezza del trasporto, come descritto in Uso della rappresentazione con La sicurezza del trasporto.
Due metodi
La sicurezza WCF SOAP ha due metodi distinti per l'impersonificazione. Il metodo utilizzato dipende dal vincolo. Una è l'impersonificazione tramite un token di Windows ottenuto dall'interfaccia Security Support Provider Interface (SSPI) o dall'autenticazione Kerberos, che viene poi memorizzato nella cache nel servizio. Il secondo è l'impersonificazione da un token di Windows ottenuto dalle estensioni Kerberos, chiamate collettivamente Service-for-User (S4U).
Impersonificazione di token memorizzati nella cache
È possibile eseguire l'impersonificazione di token memorizzati nella cache utilizzando quanto segue:
WSHttpBinding, WSDualHttpBindinge NetTcpBinding con credenziali client di Windows.
BasicHttpBinding con un BasicHttpSecurityMode impostato sulla TransportWithMessageCredential credenziale, o qualsiasi altra associazione di interfaccia standard in cui il client presenta credenziali di nome utente che il servizio può mappare a un account Windows valido.
Tutti CustomBinding che utilizzano le credenziali client di Windows con
requireCancellationimpostato sutrue. La proprietà è disponibile nelle classi seguenti: SecureConversationSecurityTokenParameters, SslSecurityTokenParameterse SspiSecurityTokenParameters. Se viene usata una conversazione sicura nell'associazione, deve anche avere larequireCancellationproprietà impostata sutrue.Qualsiasi CustomBinding in cui il client presenta una credenziale utente. Se per l'associazione viene usata una conversazione sicura, è necessario che abbia la proprietà
requireCancellationimpostata sutrue.
S4U-Based Impersonificazione
È possibile eseguire la rappresentazione basata su S4U con le seguenti modalità:
WSHttpBinding, WSDualHttpBinding e NetTcpBinding con credenziali cliente certificate che il servizio può associare a un account Windows valido.
Qualsiasi CustomBinding che utilizza credenziali client Windows con la proprietà
requireCancellationimpostata sufalse.Qualsiasi CustomBinding che utilizza un nome utente o credenziali client Windows e una conversazione protetta con la proprietà
requireCancellationimpostata sufalse.
La misura in cui il servizio può rappresentare il client dipende dai privilegi contenuti nell'account del servizio quando tenta la rappresentazione, il tipo di rappresentazione usata ed eventualmente l'estensione della rappresentazione consentita dal client.
Annotazioni
Quando il client e il servizio sono in esecuzione nello stesso computer e il client è in esecuzione con un account di sistema (ad esempio, Local System o Network Service), il client non può essere impersonato quando viene stabilita una sessione protetta con token del contesto di sicurezza con stato. Un'applicazione Windows Form o console viene in genere eseguita con l'account attualmente connesso, quindi l'account può essere impersonato per impostazione predefinita. Tuttavia, quando il client è una pagina ASP.NET e tale pagina è ospitata in IIS 6.0 o IIS 7.0, il client viene eseguito con l'account Network Service per impostazione predefinita. Tutte le associazioni fornite dal sistema che supportano sessioni sicure usano un token SCT (Security Context Token) senza stato per impostazione predefinita. Tuttavia, se il client è una pagina di ASP.NET e vengono usate sessioni sicure con SCT con stato, il client non può essere impersonato. Per ulteriori informazioni sull'utilizzo dei token di contesto di sicurezza con stato in una sessione protetta, consulta Procedura: Creare un token di contesto di sicurezza per una sessione sicura.
Impersonificazione in un metodo di servizio: Modello dichiarativo
La maggior parte degli scenari di impersonificazione comporta l'esecuzione del metodo del servizio nel contesto del chiamante. WCF fornisce una funzionalità di rappresentazione che semplifica questa operazione consentendo all'utente di specificare il requisito di rappresentazione nell'attributo OperationBehaviorAttribute . Nel codice seguente, ad esempio, l'infrastruttura WCF rappresenta il chiamante prima di eseguire il Hello metodo . Qualsiasi tentativo di accesso alle risorse native all'interno del Hello metodo ha esito positivo solo se l'elenco di controllo di accesso (ACL) della risorsa consente i privilegi di accesso del chiamante. Per abilitare l'impersonificazione, impostare la proprietà Impersonation su uno dei valori di enumerazione ImpersonationOption, ImpersonationOption.Required o ImpersonationOption.Allowed, come illustrato nell'esempio seguente.
Annotazioni
Quando un servizio dispone di credenziali superiori rispetto al client remoto, le credenziali del servizio vengono usate se la Impersonation proprietà è impostata su Allowed. Ciò significa che, se un utente con privilegi limitati fornisce le proprie credenziali, un servizio con privilegi più elevati esegue il metodo con le credenziali del servizio e può usare risorse che l'utente con privilegi limitati altrimenti non sarà in grado di usare.
[ServiceContract]
public interface IHelloContract
{
[OperationContract]
string Hello(string message);
}
public class HelloService : IHelloService
{
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string Hello(string message)
{
return "hello";
}
}
<ServiceContract()> _
Public Interface IHelloContract
<OperationContract()> _
Function Hello(ByVal message As String) As String
End Interface
Public Class HelloService
Implements IHelloService
<OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
Public Function Hello(ByVal message As String) As String Implements IHelloService.Hello
Return "hello"
End Function
End Class
L'infrastruttura WCF può rappresentare il chiamante solo se il chiamante è autenticato con credenziali di cui è possibile eseguire il mapping a un account utente di Windows. Se il servizio è configurato per l'autenticazione tramite credenziali che non possono essere mappate a un account di Windows, il metodo del servizio non viene eseguito.
Annotazioni
In Windows XP la rappresentazione ha esito negativo se viene creato un SCT con stato, generando un oggetto InvalidOperationException. Per altre informazioni, vedere Scenari non supportati.
Impersonificazione in un metodo di servizio: modello imperativo
A volte un chiamante non deve rappresentare l'intero metodo del servizio per funzionare, ma solo per una parte di esso. In questo caso, ottieni l'identità di Windows del chiamante all'interno del metodo del servizio ed esegui imperativamente l'impersonificazione. A tale scopo, utilizzare la WindowsIdentity proprietà di ServiceSecurityContext per restituire un'istanza della WindowsIdentity classe e chiamare il Impersonate metodo prima di usare l'istanza di .
Annotazioni
Assicurarsi di usare l'istruzione Visual BasicUsing o l'istruzione C# using per ripristinare automaticamente l'azione di impersonazione. Se non si usa l'istruzione o se si usa un linguaggio di programmazione diverso da Visual Basic o C#, assicurarsi di ripristinare il livello di impersonificazione. La mancata esecuzione di questa operazione può costituire la base per attacchi di Denial of Service e attacchi di elevazione dei privilegi.
public class HelloService : IHelloService
{
[OperationBehavior]
public string Hello(string message)
{
WindowsIdentity callerWindowsIdentity =
ServiceSecurityContext.Current.WindowsIdentity;
if (callerWindowsIdentity == null)
{
throw new InvalidOperationException
("The caller cannot be mapped to a WindowsIdentity");
}
using (callerWindowsIdentity.Impersonate())
{
// Access a file as the caller.
}
return "Hello";
}
}
Public Class HelloService
Implements IHelloService
<OperationBehavior()> _
Public Function Hello(ByVal message As String) As String _
Implements IHelloService.Hello
Dim callerWindowsIdentity As WindowsIdentity = _
ServiceSecurityContext.Current.WindowsIdentity
If (callerWindowsIdentity Is Nothing) Then
Throw New InvalidOperationException( _
"The caller cannot be mapped to a WindowsIdentity")
End If
Dim cxt As WindowsImpersonationContext = callerWindowsIdentity.Impersonate()
Using (cxt)
' Access a file as the caller.
End Using
Return "Hello"
End Function
End Class
Impersonamento per tutti i metodi del servizio
In alcuni casi, è necessario eseguire tutti i metodi di un servizio nel contesto del chiamante. Anziché abilitare esplicitamente questa funzionalità per metodo, usare il ServiceAuthorizationBehavior. Come illustrato nel codice seguente, impostare la ImpersonateCallerForAllOperations proprietà su true. L'oggetto ServiceAuthorizationBehavior viene recuperato dalle raccolte di comportamenti della ServiceHost classe . Notare anche che la proprietà Impersonation dell'OperationBehaviorAttribute applicato a ciascun metodo deve essere impostata su Allowed o Required.
// Code to create a ServiceHost not shown.
ServiceAuthorizationBehavior MyServiceAuthorizationBehavior =
serviceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
MyServiceAuthorizationBehavior.ImpersonateCallerForAllOperations = true;
' Code to create a ServiceHost not shown.
Dim MyServiceAuthorizationBehavior As ServiceAuthorizationBehavior
MyServiceAuthorizationBehavior = serviceHost.Description.Behaviors.Find _
(Of ServiceAuthorizationBehavior)()
MyServiceAuthorizationBehavior.ImpersonateCallerForAllOperations = True
Nella tabella seguente viene descritto il comportamento WCF per tutte le possibili combinazioni di ImpersonationOption e ImpersonateCallerForAllServiceOperations.
ImpersonationOption |
ImpersonateCallerForAllServiceOperations |
Comportamento |
|---|---|---|
| Obbligatorio | non disponibile | WCF rappresenta il chiamante |
| Permesso | falso | WCF non rappresenta il chiamante |
| Permesso | vero | WCF rappresenta il chiamante |
| NonConsentito | falso | WCF non rappresenta il chiamante |
| NonConsentito | vero | Non consentita Viene generato un InvalidOperationException. |
Livello di rappresentazione ottenuto da credenziali di Windows e rappresentazione del token memorizzato nella cache
In alcuni scenari il client ha un controllo parziale sul livello di rappresentazione eseguito dal servizio quando viene usata una credenziale client Windows. Uno scenario si verifica quando il client specifica un livello di rappresentazione anonima. L'altro si verifica quando si esegue l'impersonificazione con un token memorizzato nella cache. Questa operazione viene eseguita impostando la AllowedImpersonationLevel proprietà della WindowsClientCredential classe a cui si accede come proprietà della classe generica ChannelFactory<TChannel> .
Annotazioni
Se si specifica un livello di impersonificazione anonimo, il client accede al servizio anonimamente. Il servizio deve pertanto consentire autenticazioni anonime, indipendentemente dal fatto che venga eseguita l'impersonificazione.
Il client può specificare il livello di rappresentazione come Anonymous, Identification, Impersonation o Delegation. Viene generato solo un token a livello specificato, come illustrato nel codice seguente.
ChannelFactory<IEcho> cf = new ChannelFactory<IEcho>("EchoEndpoint");
cf.Credentials.Windows.AllowedImpersonationLevel =
System.Security.Principal.TokenImpersonationLevel.Impersonation;
Dim cf As ChannelFactory(Of IEcho) = New ChannelFactory(Of IEcho)("EchoEndpoint")
cf.Credentials.Windows.AllowedImpersonationLevel = _
System.Security.Principal.TokenImpersonationLevel.Impersonation
Nella tabella seguente viene specificato il livello di rappresentazione ottenuto dal servizio durante la rappresentazione da un token memorizzato nella cache.
valore AllowedImpersonationLevel |
Il servizio ha SeImpersonatePrivilege |
Il servizio e il client sono capaci di delegare | Token memorizzato nella cache ImpersonationLevel |
|---|---|---|---|
| Anonimo | Sì | non disponibile | Impersonificazione |
| Anonimo | NO | non disponibile | Identificazione |
| Identificazione | non disponibile | non disponibile | Identificazione |
| Impersonificazione | Sì | non disponibile | Impersonificazione |
| Impersonificazione | NO | non disponibile | Identificazione |
| Delega | Sì | Sì | Delega |
| Delega | Sì | NO | Impersonificazione |
| Delega | NO | non disponibile | Identificazione |
Livello di rappresentazione ottenuto dalle credenziali del nome utente e dalla rappresentazione del token memorizzata nella cache
Passando il nome utente e la password del servizio, un client consente a WCF di accedere come tale utente, che equivale a impostare la AllowedImpersonationLevel proprietà su Delegation. (c0 /> è disponibile sulle classi AllowedImpersonationLevel e WindowsClientCredential.) La tabella seguente fornisce il livello di impersonificazione ottenuto quando il servizio riceve le credenziali dell'utente.
AllowedImpersonationLevel |
Il servizio ha SeImpersonatePrivilege |
Il servizio e il client sono capaci di delegare | Token memorizzato nella cache ImpersonationLevel |
|---|---|---|---|
| non disponibile | Sì | Sì | Delega |
| non disponibile | Sì | NO | Impersonificazione |
| non disponibile | NO | non disponibile | Identificazione |
Livello di impersonificazione ottenuto da S4U-Based impersonificazione
Il servizio ha SeTcbPrivilege |
Il servizio ha SeImpersonatePrivilege |
Il servizio e il client sono capaci di delegare | Token memorizzato nella cache ImpersonationLevel |
|---|---|---|---|
| Sì | Sì | non disponibile | Impersonificazione |
| Sì | NO | non disponibile | Identificazione |
| NO | non disponibile | non disponibile | Identificazione |
Mappatura di un certificato client a un account di Windows
È possibile che un client esegua l'autenticazione a un servizio usando un certificato e che il servizio esegua il mapping del client a un account esistente tramite Active Directory. Il codice XML seguente illustra come configurare il servizio per eseguire il mapping del certificato.
<behaviors>
<serviceBehaviors>
<behavior name="MapToWindowsAccount">
<serviceCredentials>
<clientCertificate>
<authentication mapClientCertificateToWindowsAccount="true" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
Il codice seguente illustra come configurare il servizio.
// Create a binding that sets a certificate as the client credential type.
WSHttpBinding b = new WSHttpBinding();
b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate;
// Create a service host that maps the certificate to a Windows account.
Uri httpUri = new Uri("http://localhost/Calculator");
ServiceHost sh = new ServiceHost(typeof(HelloService), httpUri);
sh.Credentials.ClientCertificate.Authentication.MapClientCertificateToWindowsAccount = true;
Delega
Per delegare a un servizio back-end, un servizio deve eseguire l'autenticazione a più gambe Kerberos (SSPI senza fallback NTLM) o l'autenticazione diretta Kerberos al servizio back-end usando l'identità di Windows del client. Per delegare a un servizio back-end, creare un ChannelFactory<TChannel> e un canale e quindi comunicare tramite il canale mentre impersonando il client. Con questa forma di delega, la distanza a cui il servizio back-end può trovarsi dal servizio front-end dipende dal livello di impersonificazione ottenuto dal servizio front-end. Quando il livello di rappresentazione è Impersonation, i servizi front-end e back-end devono essere in esecuzione nello stesso computer. Quando il livello di rappresentazione è Delegation, i servizi front-end e back-end possono trovarsi in computer separati o nello stesso computer. L'abilitazione della rappresentazione a livello di delega richiede che i criteri di dominio di Windows siano configurati per consentire la delega. Per altre informazioni sulla configurazione di Active Directory per il supporto della delega, vedere Abilitazione dell'autenticazione delegata.
Annotazioni
Quando un client esegue l'autenticazione al servizio front-end usando un nome utente e una password che corrispondono a un account Di Windows nel servizio back-end, il servizio front-end può eseguire l'autenticazione al servizio back-end riutilizzando il nome utente e la password del client. Si tratta di una forma particolarmente potente di flusso di identità, perché il passaggio di nome utente e password al servizio back-end consente al servizio back-end di eseguire la rappresentazione, ma non costituisce la delega perché Kerberos non viene usato. I controlli di Active Directory sulla delega non si applicano all'autenticazione del nome utente e della password.
Capacità di delega come funzione del livello di rappresentazione
| Livello di impersonificazione | Il servizio può eseguire la delega tra processi | Il servizio può eseguire la delega tra computer |
|---|---|---|
| Identification | NO | NO |
| Impersonation | Sì | NO |
| Delegation | Sì | Sì |
Nell'esempio di codice seguente viene illustrato come usare la delega.
public class HelloService : IHelloService
{
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string Hello(string message)
{
WindowsIdentity callerWindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity;
if (callerWindowsIdentity == null)
{
throw new InvalidOperationException
("The caller cannot be mapped to a Windows identity.");
}
using (callerWindowsIdentity.Impersonate())
{
EndpointAddress backendServiceAddress = new EndpointAddress("http://localhost:8000/ChannelApp");
// Any binding that performs Windows authentication of the client can be used.
ChannelFactory<IHelloService> channelFactory = new ChannelFactory<IHelloService>(new NetTcpBinding(), backendServiceAddress);
IHelloService channel = channelFactory.CreateChannel();
return channel.Hello(message);
}
}
}
Public Class HelloService
Implements IHelloService
<OperationBehavior(Impersonation:=ImpersonationOption.Required)> _
Public Function Hello(ByVal message As String) As String Implements IHelloService.Hello
Dim callerWindowsIdentity As WindowsIdentity = ServiceSecurityContext.Current.WindowsIdentity
If (callerWindowsIdentity Is Nothing) Then
Throw New InvalidOperationException("The caller cannot be mapped to a Windows identity.")
End If
Dim backendServiceAddress As EndpointAddress = New EndpointAddress("http://localhost:8000/ChannelApp")
' Any binding that performs Windows authentication of the client can be used.
Dim channelFactory As ChannelFactory(Of IHelloService) = _
New ChannelFactory(Of IHelloService)(New NetTcpBinding(), backendServiceAddress)
Dim channel As IHelloService = channelFactory.CreateChannel()
Return channel.Hello(message)
End Function
End Class
Come configurare un'applicazione per l'uso della delega vincolata
Prima di poter usare la delega vincolata, il mittente, il ricevitore e il controller di dominio devono essere configurati per farlo. La procedura seguente elenca i passaggi che consentono la delega vincolata. Per informazioni dettagliate sulle differenze tra delega e delega vincolata, vedere la parte delle estensioni Kerberos di Windows Server 2003 che illustra la discussione vincolata.
Nel controller di dominio deselezionare la casella di controllo Account sensibile e non può essere delegata per l'account in cui è in esecuzione l'applicazione client.
Nel controller di dominio, seleziona la casella di controllo Account attendibile per la delega per l'account sotto cui è in esecuzione l'applicazione client.
Nel controller di dominio configurare il computer di livello intermedio in modo che sia attendibile per la delega facendo clic sull'opzione Considera attendibile il computer per la delega .
Nel controller di dominio configurare il computer di livello intermedio per l'uso della delega vincolata facendo clic sull'opzione Considera attendibile il computer per la delega solo ai servizi specificati .
Per istruzioni più dettagliate sulla configurazione della delega vincolata, vedere Transizione del protocollo Kerberos e delega vincolata.
Vedere anche
- OperationBehaviorAttribute
- Impersonation
- ImpersonationOption
- WindowsIdentity
- ServiceSecurityContext
- WindowsIdentity
- ServiceAuthorizationBehavior
- ImpersonateCallerForAllOperations
- ServiceHost
- AllowedImpersonationLevel
- WindowsClientCredential
- ChannelFactory<TChannel>
- Identification
- Uso della rappresentazione con la sicurezza del trasporto
- Impersonare il client
- Procedura: Impersonificare un client su un servizio
- Utilità per i Metadati di ServiceModel (Svcutil.exe)