Domanda

Ho una pagina ASPX (sul server A) che viene invocata usando le credenziali NTLM. Parte del lavoro di quella pagina consiste nel chiamare una pagina HTML (sul server B) e inviarla nuovamente al client. (Il firewall consente l'accesso ad A, ma non a B. All'utente verrebbe normalmente consentito l'accesso ad entrambi i server.). Anche il server B non è aperto all'accesso anonimo, quindi devo fornirgli le credenziali.

Se codifico alcune credenziali (come da codice allegato), funziona, ma idealmente farei eco alle credenziali ricevute dalla pagina aspx. C'è un modo per ottenere quei NetworkCredentials in modo da poterli trasmettere?

protected void Page_Load(object sender, EventArgs e) { 
    Response.Clear(); 
    WebClient proxyFile = new WebClient(); 
    CredentialCache cc = new CredentialCache(); 
    cc.Add(new Uri("http://serverB/"), "NTLM", 
        new NetworkCredential("userName", "password", "domain")); 
    proxyFile.Credentials = cc; 

    Stream proxyStream = proxyFile.OpenRead("http://serverB/Content/webPage.html"); 
    int i; 
    do { 
        i = proxyStream.ReadByte(); 
        if (i != -1) { 
            Response.OutputStream.WriteByte((byte)i); 
        } 
    } while (i != -1); 
    Response.End(); 
} 
È stato utile?

Soluzione

Puoi certamente ottenere il nome di accesso del chiamante, ma non la password. NTLM utilizza un meccanismo di verifica / risposta, quindi la password non viene mai trasmessa. Il tuo server deve avere accesso a una password equivalente (un hash) per formare la sfida e controllare la risposta, ma anche se puoi ottenerla, quella password equivalente non ti sarà utile nel tentativo di formare credenziali che sarà accettato dal server B.

Se puoi impostare la rappresentazione, come descritto in un'altra risposta, anche questo non ti procura necessariamente ciò che desideri. Per impostazione predefinita, un processo server impersonante non è autorizzato a trasmettere la propria identità a un altro server. Quel secondo hop è noto come delega e deve essere configurato esplicitamente sui server coinvolti (e / o in Active Directory).

Oltre alla delega, penso che la tua unica opzione sia quella di mantenere un database di credenziali a cui il server A può accedere e presentare al server B. Costruire questo in modo sicuro è un processo sottile e che richiede tempo. D'altra parte, c'è un motivo per cui la delega è disabilitata per impostazione predefinita. Quando accedo a un server, desidero che gli venga consentito di utilizzare la mia identità per accedere ad altri server? La delega è l'opzione più semplice per te, ma dovrai assicurarti che il server A non possa essere compromesso per fare cose irresponsabili con le identità dei tuoi utenti.

Altri suggerimenti

Pagina. L'utente ti procurerà il principale di sicurezza dell'utente in cui è in esecuzione la pagina.

Da lì dovresti essere in grado di capirlo.

Puoi nel tuo scenario impersonare l'identità dei chiamanti? in questo modo non avresti nemmeno bisogno di trasferire credenziali, ad esempio:

<authentication mode="Windows" />
<identity impersonate="true" />

in web.config del server A. Ma questo ovviamente dipende dalla tua situazione, poiché potresti non volerlo per il server A. Ma se puoi, potresti risolvere il tuo problema senza un codice personalizzato.

Ecco un link per impostare la rappresentazione: http: // msdn .microsoft.com / en-us / library / ms998351.aspx # paght000023_impersonatingorigcaller

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top