[ASP.NET][C#] Question de securité

Bonjour,

2 soucis.

Mon site tourne sur un serveur avec authentification integré de windows (pas d’acces anonyme).
1 )Mon site doit se connecter à un autre site web :
je m’identifie actuellement comme ceci

private System.Net.NetworkCredential iMonCredential;
this.iMonCredential = new NetworkCredential(this.iIDUser, this.iIDPassword, this.iIDDomain);

en passant les 3 parametres (un compte banalisé)
Je peux recuperer l’ID et le Domain de l’utilisateur connecté mais pas sont mot de passe ! (normal)
Y a t’il un moyen d’authentifier

this.iMonCredential

avec l’utilisateur connecté ?

  1. Mon site doit copier un fichier sur le reseau
    filecopy(origine,Destination)

sachant que le compte d’execution est ASP.NET comment copier ce fichier en m’identifiant differement (je ne veux pas habiliter le compte ASP.NET sur le repertoire).

  1. …bein non…ca doit etre tout…merci

PS : Non, non, t’as raison bishop, j’ai pris une mauvaise habitude (le forum WEBDEV c’est nouveau pour moi et j’ai du mal à m’y faire)

(sans rapport, et navré de faire mon chieur, mais y c’est le troisième post ASP.NET dans Seg Fault sur les cinq premiers messages. Pour tout ce qui touche au web, je rappele gentiment qu’il a le forum web dev. Merci de poster dans le bon forum).

Sauf que d’apres mes propres regles B)

[quote]C’est du C, du C++, du C#, du Java, du cobol, du fortran -> Seg Fault ok.

Donc on recapitule. C’est pas de la programmation -> pas ici. C’est du web, couche de presentation -> Webdev (flash, html, css, etc). Si c’est du php et que c’est un probleme d’algo, ok. Si c’est du php et un probleme d’html -> Webdev.[/quote]

La remarque sur php s’applique aussi a ASP.Net. Vu que c’est ici un probleme de backend et pas un pb de couche de presentation je pense que ca a tout a fait sa place ici personellement.

Si vous voulez, je transforme mon thread en sondage… B)

Quoi que, ici ‘Glop is the law’

A la question n° 2, Ma meilleur reponse est :

Dans le web config…

Oui, c’était tout bete et oui j’aurais du m’en rappeler, merci à :
-ma mere
-les techniciens
-le metteur en scene
et
http://www.microsoft.com/france/technet/se…e/secmod38.mspx

j’utilise le compte de l’utilisateur et ca à l’air de correspondre parfaitement à mes besoins

sinon, pour la question N°1, je suis toujour preneur : comment recupérer le user et le mot de passe (crytpé of course) pour initialiser un acces sur un autre serveur ?

merci

Et en activant l’impersonnalisation sur ton second site ca ne fonctionne pas ?

Tu peux accèder aux info de ton utilisateur via System.Threading.Thread.CurrentPrincipal mais ca ne t’aidera pas car tu n’as pas les informations pour créer un Credential correct.

Je ne suis pas maitre du 2eme site…Donc :

-Sois je fais un formulaire pour le login (ce qui est un peu lours puisque l’appli est censé masquer tous les appels qui sont fait au differents serveurs)

-Sois on definie un compte pour cet appel (solution retenu pour l’instant en attendant que le 2eme site passe en authentification aprouvé)

merci

Comme le thread s’appelle ‘securité’ je continue.

Mon site est donc en :

Quand je fais une copie de fichier dans ce style :
Byte[] lbyte = System.IO.File.ReadAllBytes("\\Serveur1\donnees\A.DOC");
System.IO.File.WriteAllBytes("\\Serveur2\donnees\A_NEW.DOC", lbyte);

En execution local (avec mon user)… Ca marche

quand je deploie sur mon serveur de test(qui a la meme config) et que j’execute de mon poste : ca plante (il m’ouvre une fenetre et me demande de m’identifier)

1 ) sachant que ‘en theorie’, c’est le meme compte (le mien) qui opere dans les 2 cas, Une idée du pourquoi du comment ? la classe system.io.file s’execute t elle sous un autre compte ?

Merci

S’il te demande tes credentials, c’est pas un problème sur ton code, c’est un problème de conf IIS : sur ton serveur, t’as bien désactivé l’accès anonyme et activé l’identification intégrée/digest ?

Si ensuite tu prends des exceptions ASP.NET, tu dois avoir les identités qui remontent dans ton eventlog, où tu dois avoir un warning ASP.NET. Ca te permettra de savoir avec quel identité tournait le thread qui a levé l’exception.

Ton problème pour ta première question a du être résolu si tu as activé l’impersonate : ton thread tournera désormais avec l’identité du mec connecté, donc tes requêtes vers ton autre site se feront aussi avec cette identitié.

Au niveau du serveur IIS? J’ai bien désactivé l’acces anonyme et j’ai activé l’identification intégré.
Au niveau du journal des événements de mon serveur IIS, j’ai ca

[code]Event code: 4011
Event message: An unhandled access exception has occurred.
Event time: 02/10/2006 10:48:00
Event time (UTC): 02/10/2006 08:48:00
Event ID: 3778d3f15d6d4af4b3fcfdaf6fa436b7
Event sequence: 4
Event occurrence: 1
Event detail code: 0

Application information:
Application domain: /LM/W3SVC/1/Root/BO-1-128042524792741204
Trust level: Full
Application Virtual Path: /BO
Application Path: D:\MONREPERTOIRE\MONREPERTOIRE\
Machine name: MAMACHINE
Process information:
Process ID: 1396
Process name: aspnet_wp.exe
Account name: MAMACHINE \ASPNET

Request information:
Request URL: http://MONREPERTOIRE/MONREPERTOIRE/DossierBO2.aspx
Request path: /MONREPERTOIRE/DossierBO2.aspx
User host address: xx.xx.x.xxx
User: MonDomaine\MonCompte
Is authenticated: True
Authentication Type: NTLM
Thread account name: MAMACHINE \ASPNET[/code]

Le user connecté est bien
MonDomaine\MonCompte
mais le thread s’execute avec le compte MAMACHINE \ASPNET…
Je suis sous 2000 et je suis en trains de me coltiner tous les sites sur le sujet…

Essaye ca :
System.Security.Principal.WindowsIdentity id = System.Threading.Thread.CurrentPrincipal.Identity as System.Security.Principal.WindowsIdentity;
if (id != null)
{
try
{
System.Security.Principal.WindowsIdentity.Impersonate(id.Token);

}
catch (Exception ex)
{
}
}
else
{
throw new SecurityException(“Windows authentication not activated”);
}

Il passe la :

System.Security.Principal.WindowsIdentity id = System.Threading.Thread.CurrentPrincipal.Identity as System.Security.Principal.WindowsIdentity;
if (id != null)
{
try
{
System.Security.Principal.WindowsIdentity.Impersonate(id.Token);

et jusqu’ici, ID contient mon utilisateur client, mais quand, à la ligne d’apres, j’accede au fichier reseau en lecture …ca plante.
J’ai l’impression qu’une délégation d’identité ce fait pour l’acces au fichier sur le reseau( c’est en gros ce que j’ai pu comprendre dans mes differentes recherches sur IE)…

Si ca ne marche pas, il y a une dernière solution : l’interop Win32.
En gros tu vas utilisé les api Win32 pour te “logger” en temps que l’utilisateur courrant.
Voilà un petit exemple :
http://west-wind.com/weblog/posts/1572.aspx

A priori, plutot que d’utiliser le handle renvoyé par LogonUser, tu dois pouvoir utiliser celui de la WindowsIdentity du thread courrant.
Il me semblait que WindowsIdentity.Impersonate faisait celà, mais visiblement ce n’est pas le cas (après petit passage sous Reflector).

Merci girafologue, je vais tenter ton truc demain, mais j’ai l’impression que ca ne va pas suffire.

Car, pour essai, si je change dans le machine.config

Pour que le compte d’execution soit un compte avec droit d’acces sur mon repertoire,
j’ai encore une demande de conexion qui est faite. et dans le journal d’application, j’ai bien :

Request information: Request URL: http://MONREPERTOIRE/MONREPERTOIRE/DossierBO2.aspx Request path: /MONREPERTOIRE/DossierBO2.aspx User host address: xx.xx.x.xxx User: MonDomaine\MonCompte Is authenticated: True Authentication Type: NTLM Thread account name: MonDomaine\MonCompte<====Preuve que le parametre est bien pris en compte
Il me semble que c’est NTLM qui n’arrive pas à récuperer le compte…Donc modifier le thread d’execution dynamiquement, me parait vain…
Et , en tapant cette reponse,comme je viens de m’apercevoir que le serveur (as400) auquel je tente d’acceder a un protocole ftp…Je vais passer par la (ce qui, à la reflexion avec moi meme, me parait mieux).

Mais, si vous avez d’autres idées pour les générations futures…
Encore merci

Le code qui suit fonctionne chez moi.

Il s’agit d’un webservice avec impersonate=“true” que j’appelle, et qui accède à un autre site (target) qui n’autorise que mon compte windows à accéder aux ressources.

Si je vire “request.Credentials…”, j’obtiens la même erreur que toi.

Ou pas… Je me suis troué en testant. J’ai appellé le webservice directement depuis mon navigateur et ça a fonctionné… En appelant depuis un proxy client webservice je reprends le tir… Je cherche. (Et si ! C’est bon en mettant aussi DefaultCredentials dans le proxy client)

[code]public string HelloWorld()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(“http://localhost/target/helloworld.txt”);
request.Credentials = System.Net.CredentialCache.DefaultCredentials;

using (HttpWebResponse reponse = (HttpWebResponse)request.GetResponse())
{
	using (StreamReader reader = new StreamReader(reponse.GetResponseStream()))
	{
		return reader.ReadToEnd();
	}
}

}[/code]