sobota, 15 kwietnia 2017

autoryzacja i uwierzytelnienie w .net - podstawy

W dzisiejszych czasach bardzo istotne jest bezpieczeństwo w sieci. Nie tylko administratorzy systemu powinni o nie dbać, ale również programiści  powinni zwrócić szczególną uwagę na autoryzację użytkownika, kontrolę dostępu do określonych zasobów czy funkcji oprogramowania.

W .net mamy bezpieczeństwo oparte na rolach. Dzięki temu można sprawdzić tożsamość użytkownika i weryfikować jego prawa do zasobów. Można to zrobić na dwa sposoby:
  •  deklaratywny (declarative security), polegający na dodawaniu atrybutów do klas, metod, bloków kodu, które będą wchodzić w skład metadanych,
  •  programowy (imperative security), polegający na dynamicznym tworzeniu zestawu uprawnień, które są sprawdzane na etapie wykonywania kodu. (Źródło: dokumentacja Microsoft)

  • Dostęp do danych zalogowanego użytkownika w systemie można uzyskać poprzez wykorzystanie klasy WinsowsIdentity.
    WindowsIdentity current = WindowsIdentity.GetCurrent();
    Potrzebna jest tutaj przestrzeń nazw System.Security.Principal .

    Znając tożsamość użytkownika możemy sprawdzić, czy jest przypisany do określonej roli.
    WindowsPrincipal currentP = new WindowsPrincipal(current);
    if(currentP.IsInRole(WindowsBuiltInRole.Administrator)){...}


    W ten sposób, można kontrolować, kto wykonuje nasz kod i na tej podstawie pozwalać lub zabraniać wykonania części kodu.

    Autoryzacja deklaratywna pozwala na określenie niezbędnych uprawnień dla całej klasy lub metody. Na początek trzeba ustawić politykę bezpieczeństwa:
    AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);

    Dopiero można wykorzystać PrincipalPermission w klasie
    class Manager
    {
        [PrincipalPermission(SecurityAction.Demand, Role="Managers")]
        static public void GetDocs()
        {
            Console.WriteLine("Manager operation");
        }
    }

    try
    {
        Manager.GetDocs();
    }
    catch (System.Security.SecurityException e)
    {
        Console.WriteLine("Only for managers");
        Console.WriteLine(e.PermissionState);
    }

    Autoryzacja programowa pozwala wejść do wnętrza metod i żądać autoryzacji dostępu do konkretnych partii kodu.
    try
    {
        PrincipalPermission pp = new PrincipalPermission(null, System.Environment.MachineName +
            @"\Administrators" , true);
        pp.Demand();
        //restricted operations
    }
    catch (System.Security.SecurityException e)
    {
        Console.WriteLine("Access denied");
    }


    Oczywiście jest to dobry sposób, kiedy piszemy aplikację dla sieci wewnętrznej i wiemy dokładnie jacy użytkownicy będą korzystać z aplikacji i jakie mają przypisane role. Niestety nie jest to dobry sposób autoryzacji i uwierzytelnienia dla stron internetowych, których odbiorcą może być każdy.

    Brak komentarzy:

    Prześlij komentarz