[ Deep|Blue @ 30.03.2005. 14:40 ] @
tj.
kako da iz aplikacije putem IO clase pristupim odredjenim lan lokacijama predstavljajuci se kao odredjeni user (sa pripadajucim pass-om) bez obzira koji je user logovan.
Takodje me interesuje, dal je moguce da aplikacija pristupa preko vise naloga lokalnim i mreznim lokacijama???
[ Mrav @ 31.03.2005. 12:02 ] @
Pogledaj .net impersonation, u principu napraviš GenericPrinciple ili GenericIdentity objekat i vežeš ga za trenutni security context preko Thread.CurrentPrincipal


Evo primera sa GenericIdentity, u ovom slučaju moraš napraviti novi GenericIdentity koristeći GenericIdentity koji si napravio.

Code:
using System;
   using System.Security.Principal;
   using System.Threading;

    public class Class1
    {
        public static int Main(string[] args)
        {
         //Create generic identity.
         GenericIdentity MyIdentity = new GenericIdentity("MyIdentity");

         //Create generic principal.
         String[] MyStringArray = {"Manager", "Teller"};
         GenericPrincipal MyPrincipal = new GenericPrincipal(MyIdentity, MyStringArray);
         //Generic principal praviš konstruktorom koji prima
         //GenericIdentity i niz stringova koji označava uloge (roles)
         //kojima želiš da pridružiš identitet.
         
         //Attach the principal to the current thread.
         //This is not required unless repeated validation must occur,
         //other code in your application must validate, or the 
         // PrincipalPermisson object is used. 
         Thread.CurrentPrincipal = MyPrincipal;
         //I na kraju zakačiš tako stvoreni identitet za trenutni Thread.

         //Print values to the console.
         String Name =  MyPrincipal.Identity.Name;
         bool Auth =  MyPrincipal.Identity.IsAuthenticated; 
         bool IsInRole =  MyPrincipal.IsInRole("Manager");
         
         Console.WriteLine("The Name is: {0}", Name);
         Console.WriteLine("The IsAuthenticated is: {0}", Auth);
         Console.WriteLine("Is this a Manager? {0}", IsInRole);
         
         return 0;
        }
    }


Što se tiče pristupa preko više naloga to bi trebalo da je moguće ako opet promeniš Thread.CurrentPrincipal, ako bi hteo istovremeni pristup različitim identitetima sigurno da bi morao da napraviš novi thread za svaki novi identitet koji želiš da napraviš.

// havramm
Molim korisnike da kada postavljaju "snippet"-e da ih uokvire "code" tagovima.
Lepse je za citanje, ako nista drugo...
[ mmix @ 31.03.2005. 14:02 ] @
Nažalost, Mrav-e, to ne rešava problem. Iako će CurrentPrincipal pokazivati na tvoj generic principal, to neće imati nikakvog uticaja na security limite koji su postavljani od strane Windows-a. Realno, laički, pogledaj kod i primetićeš da nigde nema lozinke, dakle kad bi to moglo ovako, .net aplikacija bi mogla sebi da dodeli administratorske privilegije i da vršlja po OSu . Zbog takvih bezobraznih namera Windows priznaje samo svoj mehanizam security token-a a jedini način da se dođe do tokena je preko API funkcije LogonUser:

Code:

    [DllImport("advapi32.dll", SetLastError=true)]
    public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, 
        int dwLogonType, int dwLogonProvider, ref IntPtr phToken);


phToken će imati handle na security token korisnika i taj isti handle se može iskoristiti da se kreira .net WindowsIdentity principal, koji ima metod Impersonate koji mu omogućava da privremeno promeni secuirty token trenutnog thread-a unutar samog OS-a.

Code:

            WindowsIdentity newId = new WindowsIdentity(tokenHandle);
            WindowsImpersonationContext impersonatedUser = newId.Impersonate();


WindowsImpersonationContext koji se vrati je u stvari "stari" korisnik i pozivom Undo metode stvari se vraćaju na mesto:

Code:

            impersonatedUser.Undo();


Sve OS operacije između Impersionate() i Undo() će raditi pod accountom "drugog" korisnika.

Zakačen je ceo kod (prerađen sample iz MSDNa), pa povadite šta vam treba...