Question

J'ai une page ASPX (sur le serveur A) qui est appelée à l'aide des informations d'identification NTLM. Une partie du travail de cette page consiste à appeler une page HTML (sur le serveur B) et à la renvoyer au client par proxy. (Le pare-feu autorise l'accès à A, mais pas à B. L'utilisateur devrait normalement avoir accès aux deux serveurs.). De plus, le serveur B n’est pas ouvert aux accès anonymes. Par conséquent, je dois lui fournir des informations d’authentification.

Si je code certaines informations d’identification en dur (selon le code joint), cela fonctionne, mais idéalement, je ferais écho aux informations d’identité reçues par la page .aspx. Existe-t-il un moyen d’obtenir ces NetworkCredentials afin que je puisse les transmettre?

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(); 
} 
Était-ce utile?

La solution

Vous pouvez certainement obtenir le nom de connexion de l'appelant, mais pas le mot de passe. NTLM utilise un mécanisme d'interrogation / réponse afin que le mot de passe ne soit jamais transmis. Votre serveur doit avoir accès à un mot de passe équivalent (un hachage) pour pouvoir relever le défi et vérifier la réponse, mais même si vous pouvez le récupérer, ce mot de passe équivalent ne vous sera d'aucune utilité pour tenter de former des informations d'identification qui sera accepté par le serveur B.

Si vous pouvez configurer l'emprunt d'identité, comme décrit dans une autre réponse, même cela ne vous donnera pas nécessairement ce que vous voulez. Par défaut, un processus serveur d'emprunt d'identité n'est pas autorisé à transmettre son identité à un autre serveur. Ce second saut est appelé délégation et doit être configuré explicitement sur les serveurs impliqués (et / ou dans Active Directory).

Hormis la délégation, votre seule option est de maintenir une base de données de références que le serveur A peut accéder au serveur B et lui présenter. Construire cela de manière sécurisée est un processus subtil et fastidieux. D'un autre côté, il y a une raison pour laquelle la délégation est désactivée par défaut. Lorsque je me connecte à un serveur, est-ce que je veux qu'il soit autorisé à utiliser mon identité pour accéder à d'autres serveurs? La délégation est l'option la plus simple pour vous, mais vous devez être sûr que le serveur A ne peut pas être compromis pour faire des choses irresponsables avec les identités de vos utilisateurs.

Autres conseils

Page.Utilisateur vous indiquera le principal de sécurité de l'utilisateur sous lequel la page est en cours d'exécution.

À partir de là, vous devriez pouvoir le comprendre.

Dans votre scénario, pouvez-vous emprunter l'identité de l'appelant? De cette façon, vous n’auriez même pas besoin de transmettre vos identifiants, par exemple:

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

dans web.config du serveur A. Mais cela dépend évidemment de votre situation, car vous ne voudrez peut-être pas cela pour le serveur A. Mais si vous le pouvez, cela pourrait résoudre votre problème sans code personnalisé.

Voici un lien pour configurer l'emprunt d'identité: http: // msdn .microsoft.com / fr-us / library / ms998351.aspx # paght000023_impersonatingorigcaller

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top