[.net] rolebased security toevoegen.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Voor een applicatie die ik op dit moment aan het ontwikkelen ben is het noodzakelijk dat er beveiliging in komt waarmee ik kan garanderen dat bepaalde acties ook alleen worden gedaan door groepen mensen die de juiste privileges hebben -> role based security.

Mijn vraag is hoe ik dit het beste kan realiseren op het .NET platform.

Wat moet er allemaal afgeschermd zijn?
Er moet een bepaalde rol zijn (soortement van admin) die Universiteiten kan aanmaken in de universiteits tabel. Verder moet er voor iedere universiteit een rol komen waarmee allerlei eigenschappen van universiteiten ingesteld kunnen worden. Het moet zo zijn dat deze rollen gebonden zijn aan 1 specifieke universiteit.

Verder kan een universiteit weer faculteiten hebben en voor iedere faculteit moet ook weer een rol aangemaakt worden, waardoor allerlei eigenschappen van faculteiten aangepast kunnen worden. Hierbij geldt weer dezelfde voorwaarde dat faculteiten elkaars gegevens niet kunnen wijzigen.

Ok.. tot zover wat ik wil in grote lijnen.

Hoe kan ik dit het beste in .NET realiseren? In hoeverre zijn hier al voorzieningen voor? Kan ik bv aan een of andere Threadlocal een rol/user binden die bij het uitvoeren van een service methode wordt gechecked? Liefst via ubergeile attributen:


C#:
1
2
3
4
[requiresRole(siteAdmin)]
public void Delete(UniversiteitEntity universiteit){
    ...
}


Hoe zit het verder met database koppelingen? Ik kan alles wel in de db stoppen, maar het lijkt me dat zoveel applicaties dit al gedaan hebben dat er vast wel kant en klare componenten voor moeten zijn.

[ Voor 3% gewijzigd door Alarmnummer op 02-12-2004 20:49 ]


Acties:
  • 0 Henk 'm!

  • TlighT
  • Registratie: Mei 2000
  • Laatst online: 28-05 10:31
Gewone role-based security is gemakkelijk te implementeren in .NET. De basis is dat je een principal object toekent aan de Thread.CurrentPrincipal property of HttpContext.Current.User property (ASP.NET). Een principal klasse implementeert de IPrincipal interface, hier zit o.a. de method IsInRole(string role) op.

Zodra je dat hebt, kun je op verschillende manieren rechten controleren, zowel imperatief als declaratief (via de PrincipalPermissionAttribute) of in de web.config om webpagina's af te schermen.

Voor kant- en klare componenten zou je eens kunnen kijken naar het Authorization and Profile Application Block, die biedt ondermeer ondersteuning voor pluggable authorization providers. Ik heb het zelf nog niet gebruikt dus ik weet niet of er al standaard providers meegeleverd worden.

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 13-09 23:21
Ga je voor 'Windows Authentication', en wil je die 'role-based' security op basis van de Windows groepen, of ga je voor een Custom authentication ?

Oké, lezen dus: custom. :P

Zoals TlightT al zegt, gewoon de rollen ophalen uit je DB, en deze toekennen aan je Principal.
Om je pagina's te beveiligen, kan je eens kijken naar de authentication en authorization blokken in je web.config.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Scare360
  • Registratie: Juli 2001
  • Laatst online: 19-08 16:50
Zie dit artikeltje Peter. Een policy op je AppDomain zetten is iig de manier. Onderstaad wat code hoe vervolgens security in je model onderbrengt... met "ubergeile" attributen ;)

Ik heb iets soortgelijks gemaakt waar een oude VB6 COM server naar de database ging om gebruikers te authentificeren, waar vervolgens een in .NET wrapper omheen zat welke een principal instantie maakte en zette op de AppDomain.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/// $Header:
using System;
using System.Security.Principal;

namespace PaulGielens.Security.Tests
{
    public class TestBase
    {
        private bool principalSet = false;

        protected void SetupAppDomain(IPrincipal principal)
        {
            // threads in this application domain bind to this principal
            if (!principalSet)
            {
                AppDomain.CurrentDomain.SetThreadPrincipal(principal);
                principalSet = true;
            }
        }
    }
}


/// $Header:
using System.Security.Permissions;

namespace PaulGielens.Security.Tests
{
    public class DeclarativeSecureObject
    {
        [PrincipalPermission(SecurityAction.Demand, Role="Users")]
        public void UserMethod()
        {
        }

        [PrincipalPermission(SecurityAction.Demand, Role="Managers")]
        public void ManagerMethod()
        {
        }
    }
}


/// $Header:
using System.Security;
using System.Security.Permissions;

namespace PaulGielens.Security.Tests
{
    public class ImperativeSecureObject
    {
        public void UserMethod()
        {
            PrincipalPermission permission = new PrincipalPermission(null, "Users");
            permission.Demand();
        }

        public void ManagerMethod()
        {
            PrincipalPermission permission = new PrincipalPermission(null, "Managers");
            permission.Demand();
        }

        public void UserAndAdminMethod()
        {
            PrincipalPermission userPermission = new PrincipalPermission(null, "Users");
            PrincipalPermission adminPermission = new PrincipalPermission(null, "Admins");

            IPermission permission = userPermission.Union(adminPermission);
            permission.Demand();
        }
    }
}

[ Voor 3% gewijzigd door Scare360 op 03-12-2004 10:56 ]


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024
Dank u :)

Ok.. ik heb nu het volgende:

code:
1
2
3
4
[PrincipalPermission(SecurityAction.Demand, Role="InstellingAdmin")]
public void Delete(InstellingEntity instelling){
    base.Delete(instelling);
}


Het probleem is nu dat iedere instelling admin, iedere andere instelling kan aanpassen en dat is niet de bedoeling. Alleen de admin van de instelling mag die instelling aanpassen.


Ik had al zoiets bedacht:
code:
1
2
3
4
[PrincipalPermission(SecurityAction.Demand, Role="InstellingAdmin:"+instelling.NAAM)]
public void Delete(InstellingEntity instelling){
    base.Delete(instelling);
}


Maar dat vond de compiler niet goed :)

Acties:
  • 0 Henk 'm!

  • SuperRembo
  • Registratie: Juni 2000
  • Laatst online: 20-08 14:36
Je hoeft 't niet m.b.v. attributes in te stellen.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
c#]public static void PrivateInfo()
   {
      try
      {
         //Create a PrincipalPermission object.
         PrincipalPermission MyPermission = new PrincipalPermission("MyUser", "Administrator");
        
         //Demand this permission.
         MyPermission.Demand();

         //Print secret data.
         Console.WriteLine("\n\nYou have access to the private data!");
      }
      catch(SecurityException e) 
      {
         
         Console.WriteLine(e.Message);
      }
   }

bron

| Toen / Nu


Acties:
  • 0 Henk 'm!

  • TlighT
  • Registratie: Mei 2000
  • Laatst online: 28-05 10:31
Alarmnummer schreef op vrijdag 03 december 2004 @ 13:29:
Het probleem is nu dat iedere instelling admin, iedere andere instelling kan aanpassen en dat is niet de bedoeling. Alleen de admin van de instelling mag die instelling aanpassen.


Ik had al zoiets bedacht:
code:
1
2
3
4
[PrincipalPermission(SecurityAction.Demand, Role="InstellingAdmin:"+instelling.NAAM)]
public void Delete(InstellingEntity instelling){
    base.Delete(instelling);
}


Maar dat vond de compiler niet goed :)
Ik begeef me hier op niet-zo-bekend terrein, maar je zou eens kunnen proberen je eigen attribuut klasse te schrijven en die te inheritten van CodeAccessSecurityAttribute. Op deze manier kun je je eigen properties op het attribuut definieren (bijvoorbeeld de naam van de instelling).
The types that derive from CodeAccessSecurityAttribute are used to secure access to resources or securable operations.

The security information declared by a security attribute is stored in the metadata of the attribute target and is accessed by the system at run time. Security attributes are used only for declarative security. Use the corresponding permission class derived from CodeAccessPermission for imperative security.
Wat je kunt doen is Reflector downloaden en dan bekijken hoe de PrincipalPermissionAttribute klasse in elkaar zit. Je eigen klasse zou dan op eenzelfde manier moeten werken.

Hier staat ook meer uitgelegd over custom permissions.
Pagina: 1