Ottenere errore 403 Forbidden. La richiesta HTTP è stato vietato con lo schema di autenticazione client ‘Anonimo’

Questo problema che sto avendo non accade per tutti i client che accedono ai nostri servizi, ma ciò che è costante è che quando si verifica questo errore, che sta succedendo nella stessa chiamata al servizio per una manciata di clienti.

Qui ci sono i dettagli dell’eccezione:

Sistema.ServiceModel.Di sicurezza.MessageSecurityException La richiesta HTTP
era proibito con lo schema di autenticazione client “Anonimo”.
Sistema.ServiceModel.Di sicurezza.MessageSecurityException: HTTP
la richiesta è stata vietata con lo schema di autenticazione client “Anonimo”.
> —> Sistema.Net.WebException: Il server remoto ha restituito un errore: (403) Vietato. a Sistema.Net.HttpWebRequest.GetResponse() a
Sistema.ServiceModel.Canali.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan
timeout) — Fine dell’analisi dello stack dell’eccezione interna — Server
stack trace: a
System.ServiceModel.Security.IssuanceTokenProviderBase1.DoNegotiation(TimeSpan
timeout) at
System.ServiceModel.Security.SspiNegotiationTokenProvider.OnOpen(TimeSpan
timeout) at
System.ServiceModel.Security.TlsnegoTokenProvider.OnOpen(TimeSpan
timeout) at
System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan
timeout) at
System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan
timeout) at
System.ServiceModel.Security.CommunicationObjectSecurityTokenProvider.Open(TimeSpan
timeout) at
System.ServiceModel.Security.SecurityUtils.OpenTokenProviderIfRequired(SecurityTokenProvider
tokenProvider, TimeSpan timeout) at
System.ServiceModel.Security.SymmetricSecurityProtocol.OnOpen(TimeSpan
timeout) at
System.ServiceModel.Security.WrapperSecurityCommunicationObject.OnOpen(TimeSpan
timeout) at
System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan
timeout) at
System.ServiceModel.Channels.SecurityChannelFactory
1.ClientSecurityChannel1.OnOpen(TimeSpan
timeout) at
System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan
timeout) at
System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.DoOperation(SecuritySessionOperation
operation, EndpointAddress target, Uri via, SecurityToken
currentToken, TimeSpan timeout) at
System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.GetTokenCore(TimeSpan
timeout) at
System.IdentityModel.Selectors.SecurityTokenProvider.GetToken(TimeSpan
timeout) at
System.ServiceModel.Security.SecuritySessionClientSettings
1.ClientSecuritySessionChannel.OnOpen(TimeSpan
timeout) a
Sistema.ServiceModel.Canali.CommunicationObject.Aperto(Tempo
timeout) a
Sistema.ServiceModel.Canali.ServiceChannel.OnOpen(Intervallo di timeout)

a Sistema.ServiceModel.Canali.CommunicationObject.Aperto(Tempo
timeout) a
System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel
canale, Intervallo di timeout) a
Sistema.ServiceModel.Canali.ServiceChannel.CallOnceManager.CallOnce(TimeSpan
timeout, CallOnceManager cascata) a
Sistema.ServiceModel.Canali.ServiceChannel.EnsureOpened(TimeSpan
timeout) a
Sistema.ServiceModel.Canali.ServiceChannel.Chiamata(String azione,
Boolean a senso unico, ProxyOperationRuntime operazione, Object[] ins,
Object[] outs Tempo di timeout) a
Sistema.ServiceModel.Canali.ServiceChannel.Chiamata(String azione,
Boolean a senso unico, ProxyOperationRuntime operazione, Object[] ins,
Object[] out) a
Sistema.ServiceModel.Canali.ServiceChannelProxy.InvokeService(IMethodCallMessage
methodCall, ProxyOperationRuntime operazione) a
Sistema.ServiceModel.Canali.ServiceChannelProxy.Invoke(IMessage
messaggio di Eccezione rigenerata a [0]: a
Sistema.Runtime.Remoting.Deleghe.RealProxy.HandleReturnMessage(IMessage
reqMsg, IMessage retMsg) a
Sistema.Runtime.Remoting.Deleghe.RealProxy.PrivateInvoke(MessageData&
msgData, tipo Int32) a
> Proxy.FileTransferService.IFileTransferService.EstablishProxy(DownloadRequest
richiesta)
al Proxy.FileTransferService.FileTransferServiceClient.
Proxy.FileTransferService.IFileTransferService.EstablishProxy(DownloadRequest
richiesta) a NormalFileTransferServiceClient.Download(Int32
idpacchetto, IStreamWriter downloader, Archiver archiver) a
LoggingFileTransferServiceClient.Download(Int32 idpacchetto, ISt

Che l’eccezione è stata generata dal client.

Il client di configurazione del proxy per IFileTransferService è:

<binding name="WSHttpBinding_IFileTransferService" closeTimeout="00:01:00"
  openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
  bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
  maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Mtom"
  textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
  <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
  <reliableSession ordered="true" inactivityTimeout="00:10:00"
    enabled="false" />
  <security mode="Message">
    <transport clientCredentialType="Windows" proxyCredentialType="None"
      realm="" />
    <message clientCredentialType="UserName" negotiateServiceCredential="true"
      algorithmSuite="Default" establishSecurityContext="true" />
  </security>
</binding>

  <endpoint address="http://[hostname]/FileTransferService.svc/FileTransfer"
    binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IFileTransferService"
    contract="Proxy.FileTransferService.IFileTransferService"
    name="WSHttpBinding_IFileTransferService">
    <identity>
      <certificate encodedValue="a long string"/>
    </identity>
  </endpoint>

La configurazione del servizio è

<service behaviorConfiguration="ServiceBehavior" 
    name="Services.FileTransferService">
        <endpoint name="WSHttpBinding_IFileTransferService" 
       binding="wsHttpBinding" 
       bindingConfiguration="MtomWSHttpBinding" 
       contract="Services.IFileTransferService" 
       address="/FileTransfer"/>
        <endpoint binding="basicHttpBinding" 
       bindingConfiguration="FileTransferServicesBinding" 
       contract="Services.IFileTransferService"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://[hostname]/FileTransferService.svc"/>
          </baseAddresses>
        </host>
</service>

<binding name="wsHttpBinding" 
         maxReceivedMessageSize="2147483647" 
         receiveTimeout="5" 
         useDefaultWebProxy="false">
      <readerQuotas maxDepth="2147483647" 
             maxStringContentLength="2147483647" 
             maxArrayLength="2147483647" 
             maxBytesPerRead="2147483647" 
             maxNameTableCharCount="2147483647" />
  <security mode="Message">
    <message clientCredentialType="UserName" />
  </security>
</binding>

<basicHttpBinding>
    <binding name="FileTransferServicesBinding" 
           maxReceivedMessageSize="10067108864" 
           messageEncoding="Mtom" 
           transferMode="Streamed" 
           useDefaultWebProxy="false">
      <security mode="None">
        <message clientCredentialType="UserName" />
      </security>
    </binding>
  </basicHttpBinding>

Nota: alcuni client utilizza la basicHttpBinding (se ho impostato tutto correttamente). Nella successiva release del client, che non possono completamente essere distribuito (che è il motivo per cui devo sostenere 2 versione), ho cambiato il proxy per utilizzare il wsHttpBinding endpoint, invece. Mi chiedo se questo errore che ricevo è specifico per basicHttp e se è così, forse non ho queste configurazioni impostate correttamente. Io sono sotto l’ipotesi che i clienti che stanno ottenendo questo errore 403 utilizza il wsHttpBinding.

Qui è il codice per il servizio:

public RemoteBinaryInfo EstablishProxy(DownloadRequest request)
{
    int packageId = request.PackageId;

    System.IO.MemoryStream stream = new System.IO.MemoryStream(packageRepository.GetPackageBinary(packageId));

    DisposeStreamWhenOperationIsComplete(stream, OperationContext.Current);

    RemoteBinaryInfo result = new RemoteBinaryInfo();
    result.Length = stream.Length;
    result.MemoryByteStream = stream;
    return result;

}

private static void DisposeStreamWhenOperationIsComplete(System.IO.MemoryStream stream, OperationContext clientContext)
{
    clientContext.OperationCompleted += new EventHandler(delegate(object sender, EventArgs args)
    {
        if (stream != null)
            stream.Dispose();
    });
}

Non so se sbarazzarsi di questa eccezione è qualcosa all’interno del mio controllo? Ci sono eventuali modifiche di configurazione che posso fare sia da parte del cliente o servizio di file di configurazione?

Se avete bisogno di più informazioni da me per favore fatemelo sapere.

  • Se non già fatto, si dovrebbe cercare di esporre un semplice hello world metodo per isolare il problema.
InformationsquelleAutor SideFX | 2011-10-19



3 Replies
  1. 3

    Nel mio caso questo errore è stato dalla nostra organizzazione server proxy HTTP. Trovato da:
    MessageSecurityException.InnerException.Response.Headers:

    {Mime-Version: 1.0

    X-Calamari-Errore: ERR_ACCESS_DENIED 0

    X-Cache: MISS da <

    X-Cache-Ricerca: NESSUNA dal < proxy-server-indirizzo>

    Proxy-Connection: close

    Content-Length: 2165

    Content-Type: text/html

    Data: Wed, 25 Apr 2012 10:55:39 GMT

    Server: il Server squid/3.0.STABLE25

    Via: 1.0 < proxy-server-indirizzo> (squid/3.0.STABLE25)

    }

    Nel mio caso, inoltre, si è verificato per un metodo di trasferimento file trasferimento di file di blocchi in un byte array di dimensione 16384. Sulla riduzione della dimensione di 10000, l’errore è stato risolto. Questo significa che il proxy server aveva un qualche tipo di limite di dimensione del set.

    Su una macchina con l’accesso diretto a internet, il metodo di trasferimento file non riuscita con questo errore, anche per la dimensione della matrice > 16384.

    Poiché solo alcuni dei vostri clienti sono di fronte a questo problema, forse sono dietro un firewall /proxy server che è quello che effettivamente bloccando l’accesso e la restituisce questo errore?

    • Stesso qui. Dimenticato di controllo ignora server proxy per indirizzi locali
  2. 0

    Mi sembra il client che ricevono MessageSecurityException non fornire un valido nome utente/password con la loro richiesta.

    Vedere il seguente articolo di msdn http://msdn.microsoft.com/en-us/library/ms733131.aspx

    • Se quanto sopra è stato fatto, c’è una connessione tra il client che ricevono l’errore del dominio che si sta chiamando? Sarebbe anche utile per escludere che i clienti che ricevono un errore non inviano le loro richieste attraverso un proxy. Se nessuno dei che aiuta, abilitare l’analisi del messaggio sia il client e il servizio: msdn.microsoft.com/en-us/library/ms730064.aspx
    • Il nome utente e la password forniti direttamente nel codice, dopo che è stata decifrata. Non c’è interazione umana tra il cliente e questi servizi. I proxy che ho generato sono distribuiti con una domanda e viene eseguito automaticamente.
    • Ho già questo creds.ServiceCertificate.L’autenticazione.CertificateValidationMode = X509CertificateValidationMode.PeerTrust; ma questo potrebbe forse risolvere il problema: creds.ServiceCertificate.L’autenticazione.TrustedStoreLocation = StoreLocation.LocalMachine; L’errore che ricevo non accade per ogni richiesta del client, ma forse una specifica configurazione di rete client si renderebbe necessario aggiungere il codice riportato sopra. Quale sarebbe lo scopo per espressa indicazione dell’ubicazione del server cert client?
    • Attualmente ho creds.ServiceCertificate.L’autenticazione.CertificateValidationMode = X509CertificateValidationMode.Nessuno nel codice del client, anche se il certificato viene memorizzato nel TrustPeople memorizzare su un host remoto.
  3. 0

    Così è un servizio web configurato IIS utilizza l’autenticazione Anonima, e si ottiene un errore 403 forbidden solo per una manciata di utenti.

    Dalla mia esperienza questo di solito è causato da un accesso negato eccezione quando si accede a un ACL controllato di risorse di sistema come file di sistema.

    Ogni utente collegato anomala avranno la loro richiesta di elaborazione (supponendo di IIS 7) w3wp.exe processo che ha, di norma, l’identità del pool di applicazioni IIS (APPPOOL/AppPoolName), se l’identità non viene aggiunto a qualsiasi richiesta elenchi di controllo di accesso negato l’accesso, salvo causa di IIS risposto con un errore 403.

    Io di solito aggiungere l’identità del pool di applicazioni di un gruppo, quindi aggiungere il gruppo per qualsiasi richiesta di risorse.

    Se non si riesce a capire quali risorse potrebbe essere la causa dell’eccezione, prova a guardare nel registro eventi di protezione per “Errore di Controllo” voci di indizi. Potrebbe essere necessario configurare il criterio di protezione locale per la protezione del registro eventi.

    buona fortuna

Lascia un commento