[ASP.NET] Role-Based Security implementeren

Pagina: 1
Acties:

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 12:42
Waarschijnlijk ben ik niet de eerste die hier tegen aan loopt, hoop ik.

Ik ben bezig een website te maken waarin gebruikers in verschillende rollen worden gestopt.
De gebruikers en Rollen staan in de database (MSSQL 2000) evenals de SecurityTokens.

De functionaliteit van de website hangt van de tokens af.

Gedeeltelijk database diagram:

Afbeeldingslocatie: http://www.dentol.nl/got/erdNodeSecurity.gif

Ik heb twee standaard rollen:
- Anonymous
- Manager

De admin kan additionele rollen aanmaken.

Ik heb een aantal methoden voor me liggen en zal ze even per stuk beschrijven:

Methode 1:
De UserID en de RoleID in een cookie zetten, en in elke Page_Load controleren of de rol toegang heeft tot tokens:

Methode 2:
De rollen handmatig in de web.config zetten om zo per file aan te geven welke Rol welke bestanden kan gebruiken (deze valt eigenlijk al meteen af, omdat de rolllen niet uit de DB gehaald kunnen worden, en een pagina niet specifiek aan een rol aan te passen is…)

Methode 3:
Gebruik maken van de ASP.NET Role-Based security model.
Ik heb het stuk op MSDN (http://msdn.microsoft.com...conrole-basedsecurity.asp) gelezen, maar kan nergens vinden hoe je de security tokens per Rol kan aangeven en hoe ik deze uit een DB kan halen


Ik begin steeds meer richting Methode 1 te gaan omdat ik dan alles zelf in de hand heb.

Heeft iemand betere methodes (vast wel :P) of voorbeelden?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:14

gorgi_19

Kruimeltjes zijn weer op :9

Hier staat een uitgebreid voorbeeld van RoleBased Security van IBuySpy
http://www.ibuyspyportal....c&file=Global.asax&rows=2

De rest van de uitwerking kan je wel in de documentatie vinden.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Dit is wel erg interessant. Ik zit precies met hetzelfde item alleen heb er nog geen problemen mee.

Maar ASP.NET zit vol met verrassingen dus volgende week of zo loop ik hier vanzelf wel tegen aan :)

Ik heb een complete website gebouwd in ASP. Vanaf volgende week ga ik die stukje bij beetje omzetten naar ASP.NET maar wel vanaf scratch.

Er zit nu ook een vorm van authenticatie in maar die valt in het niet als je kijkt hoe je het aan kan pakken met ASP.NET (voor mij als coder veel makkelijker dan met ASP).

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 12:42
gorgi_19 schreef op 11 december 2002 @ 19:11:
Hier staat een uitgebreid voorbeeld van RoleBased Security van IBuySpy
http://www.ibuyspyportal....c&file=Global.asax&rows=2

De rest van de uitwerking kan je wel in de documentatie vinden.
Het vervelende van deze methode is dat je alleen maar kan aangeven of een rol toegang heeft of niet.

Ik werk echter met security tokens. Per rol kan je dus aangeven tot welke functies hij toegang heeft...

Voorbeeld van de tokens die ik gebruik:
AddDocument
AddNode
BackImageBrowse
BackImageEdit
BackImageResize
BackImageUse
ChangeCache
ChangeConfiguration
CopyNode
DelDocument
DelNode
EditDocument
EditNode
FtpAccess
ImportExport
JoinLeaveVersions
ManageProperties
ManageSecurity
ManageUsers
NodeID
RoleID
RteAlign
RteBold
RteColor
RteCommonImage
RteFont
RteImage
RteIndent
RteItalic
RteLink
RteList
RteRemoveFormatting
RteSize
RteSource
RteStrikeThrough
RteStyle
RteTable
RteUndeline
SaveDiscardVersionChanges
TakeOwnerShip
Undo
UseRte
Versioning
ViewBackSite
ViewHistory
ViewNode

Ik zal dus per actie moeten kijken of de rol daar toegang tot heeft...

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:14

gorgi_19

Kruimeltjes zijn weer op :9

In je database kan je eventueel toch nog groepen maken?

Het lijkt me dat er per actie maar 2 'rollen' toegang hebben; admin en de betreffende role.
Je kan natuurlijk ook meerdere rollen per user toekennen. (en vergelijk het met het aanmaken van groepen)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Gebruik klasse?

class userdetails
public ftp as boolean
public adddoc as boolean
end class

class userdb
public getuserdetails (byval userid as integer) as userdetails
end class

hoef je alleen maar userid in sessie var oid bij te houden en rechten kun je zo opvragen met methode

Verwijderd

moet natuurlijk public function zijn in klasse db.

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 12:42
gorgi_19 schreef op 11 December 2002 @ 22:50:
In je database kan je eventueel toch nog groepen maken?

Het lijkt me dat er per actie maar 2 'rollen' toegang hebben; admin en de betreffende role.
Je kan natuurlijk ook meerdere rollen per user toekennen. (en vergelijk het met het aanmaken van groepen)
Heb ik aan zitten denken ja...Maar ik weet niet of het handig is om meerdere rollen aan een gebruiker te koppelen.

Wat is de meer waarde dan als ik gebruikersgroepen maak om die dan weer aan rollen te hangen?

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 12:42
Verwijderd schreef op 11 December 2002 @ 22:54:
moet natuurlijk public function zijn in klasse db.
Ben ik mee bezig:

http://phonetech.homeip.net/got/security.cs.txt

:D

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 16:14

gorgi_19

Kruimeltjes zijn weer op :9

PhoneTech schreef op 11 December 2002 @ 22:54:
[...]


Heb ik aan zitten denken ja...Maar ik weet niet of het handig is om meerdere rollen aan een gebruiker te koppelen.

Wat is de meer waarde dan als ik gebruikersgroepen maak om die dan weer aan rollen te hangen?
Imho heb je dan een grote mate van flexibiliteit.
Als je het voorbeeld neemt van IBuySpy, dan heeft een user bijvoorbeeld als rollen

AdvertisementEditor;StaffEditor;ContentEditor;

Gecontroleerd wordt dan vervolgens met:
Visual Basic .NET:
1
2
3
If User.IsInRole("AdvertisementEditor") then
    'voer actie uit
End if


De rollen zorgen er voor dat je snel gebruikers kan toevoegen / verwijderen uit een activiteit. Verder hoef je dan niet zo een gruwelijk grote class te maken als je nu doet.

[ Voor 7% gewijzigd door gorgi_19 op 12-12-2002 09:14 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 12:42
gorgi_19 schreef op 12 december 2002 @ 09:13:
[...]

Imho heb je dan een grote mate van flexibiliteit.
Als je het voorbeeld neemt van IBuySpy, dan heeft een user bijvoorbeeld als rollen

AdvertisementEditor;StaffEditor;ContentEditor;

Gecontroleerd wordt dan vervolgens met:
Visual Basic .NET:
1
2
3
If User.IsInRole("AdvertisementEditor") then
    'voer actie uit
End if


De rollen zorgen er voor dat je snel gebruikers kan toevoegen / verwijderen uit een activiteit. Verder hoef je dan niet zo een gruwelijk grote class te maken als je nu doet.
Volgens mij spreek je je zelf nu tegen. Ik zou dan per security token een rol moeten maken als ik het op de de IBuySpy methode doe.

De methode die ik , denk ik, ga gebruiken is

C#:
1
2
3
in elke Page_Load
If (!oSec.viewNode(RoleID, NodeID) { accessdenied scriptje }
If (!oSec.addNode(RoleID, NodeID) { voeg knopje add toe }


enz. enz.

Verwijderd

Hier is een gratis boek van Microsoft te vinden met als titel "Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication". Mischien heb je er iets aan :).

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 12:42
Verwijderd schreef op 12 December 2002 @ 10:41:
Hier is een gratis boek van Microsoft te vinden met als titel "Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication". Mischien heb je er iets aan :).
Als iedereen boeken ging lezen, zou de devschuur redelijk leeg zijn volgens mij ;)

Ik heb idd een paar hoofdstukken gelezen en heb aardig wat inzicht, maar het boek gaat vooral weer over of rollen toegang hebben tot een form of niet...bij mij is het wat subtieler....

Verwijderd

De roles zijn je groepen rechten. Per role geef je rechten op een zeker object binnen je systeem, bv een 'forum' of een 'page' of 'item'. Wat die rechten zijn doet er even niet toe, dat is puur interpretatie-technisch mbt die rechten.

Een user heeft bv 1 of meerdere roles toebedeeld gekregen, en 'erft' daarmee de rechten die bij die roles horen op de objecten die in de role-object-right relatie zijn gedefinieerd. Ik heb het in mn forummodule zo gedefinieerd dat bij inloggen van de user (1e leesactie van een page, ik gebruik formbased security van asp.net) via de global.asax de roles-object-right relaties van die user in zn session worden geladen.

Ik heb verder wat functies geschreven die toetsen of een zekere user een zeker recht heeft op een zeker object. Insteek is dan de role-object-right relaties geladen in de session van de user. Dus bv: je mag een zeker object editen indien je editrights hebt op objecttype X. Je toetst dan of de current user dat recht op dat type object bezit. Zo ja-> door, zo nee: redirecten, want is aan het hacken.

welke objects welke rechten vereisen kun je hardcoded vastleggen, je kunt dat ook weer dynamisch maken en bv in je application object laden bij starten van de applicatie.

[ Voor 3% gewijzigd door Verwijderd op 12-12-2002 11:43 ]


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 12:42
Verwijderd schreef op 12 december 2002 @ 11:42:
De roles zijn je groepen rechten. Per role geef je rechten op een zeker object binnen je systeem, bv een 'forum' of een 'page' of 'item'. Wat die rechten zijn doet er even niet toe, dat is puur interpretatie-technisch mbt die rechten.

Een user heeft bv 1 of meerdere roles toebedeeld gekregen, en 'erft' daarmee de rechten die bij die roles horen op de objecten die in de role-object-right relatie zijn gedefinieerd. Ik heb het in mn forummodule zo gedefinieerd dat bij inloggen van de user (1e leesactie van een page, ik gebruik formbased security van asp.net) via de global.asax de roles-object-right relaties van die user in zn session worden geladen.

Ik heb verder wat functies geschreven die toetsen of een zekere user een zeker recht heeft op een zeker object. Insteek is dan de role-object-right relaties geladen in de session van de user. Dus bv: je mag een zeker object editen indien je editrights hebt op objecttype X. Je toetst dan of de current user dat recht op dat type object bezit. Zo ja-> door, zo nee: redirecten, want is aan het hacken.

welke objects welke rechten vereisen kun je hardcoded vastleggen, je kunt dat ook weer dynamisch maken en bv in je application object laden bij starten van de applicatie.
Dus dat is een combinatie tussen de formsauthentication die in ASP.NET ingebakken zit, en zoals ik in

code:
--------------------------------------------------------------------------------
in elke Page_Load
If (!oSec.viewNode(RoleID, NodeID) { accessdenied scriptje }
If (!oSec.addNode(RoleID, NodeID) { voeg knopje add toe }
--------------------------------------------------------------------------------

heb gedaan. Of zit ik er nu weer naast!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Het lijkt erop dat jij de roleid meegeeft, maar dat hoeft niet. Wat je moet doen, is volgens mij, dat je bv doet:

if(HasAccessRights(type_van_right, wat_voor_recht_men_moet_hebben)
{
// has right, do stuff;
}

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 12:42
Zo...Na een weekje rust, heb ik de draad weer opgepakt met mijn beveiligingsvraagstuk.

Ik heb ongeveer de manier van Otis aangehouden.

In de Global.ascx staat nu:
C++:
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
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{

    if (Request.IsAuthenticated == true) 
    {
        ArrayList userRoles = new ArrayList();

        // Create the roles cookie if it doesn't exist yet for this session.
        if ((Request.Cookies["UserRoles"] == null) || (Request.Cookies["UserRoles"].Value == "")) 
        {

            int UserID = Int32.Parse(User.Identity.Name);
            
            // Get roles from UserRoles table, and add to cookie
            Components.Users oUser = new Components.Users();
            DataTable dtRoles = oUser.getUserRoles(UserID);
                            
            
            // Create a string to persist the roles
            string roleStr = "";
            for (int i=0; i < dtRoles.Rows.Count; i++)
            {
                roleStr += dtRoles.Rows[i]["RoleID"].ToString();
                roleStr += ";"; 
                userRoles.Add(dtRoles.Rows[i]["RoleID"].ToString());
            }

            
            // Create a cookie authentication ticket.
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                1,                              // version
                Context.User.Identity.Name,     // user name
                DateTime.Now,                   // issue time
                DateTime.Now.AddHours(1),       // expires every hour
                false,                          // don't persist cookie
                roleStr                         // roles
                );

            // Encrypt the ticket
            String cookieStr = FormsAuthentication.Encrypt(ticket);

            // Send the cookie to the client
            Response.Cookies["UserRoles"].Value = cookieStr;
            Response.Cookies["UserRoles"].Path = "/";
            Response.Cookies["UserRoles"].Expires = DateTime.Now.AddMinutes(1);
        }
        else 
        {
            

            // Get roles from roles cookie
            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Context.Request.Cookies["UserRoles"].Value);

            //convert the string representation of the role data into a string array
            //ArrayList userRoles = new ArrayList();

            foreach (String role in ticket.UserData.Split( new char[] {';'} )) 
            {
                userRoles.Add(role);
            }                   
        }

        string[] roles = (String[]) userRoles.ToArray(typeof(String));

        // Add our own custom principal to the request containing the roles in the auth ticket
        Context.User = new GenericPrincipal(Context.User.Identity, roles);
    }

}


Maar nu...hoe nu verder! Ik heb nog steeds niet door hoe je dan de userrights vast legt.

Ik heb nog steeds het beveiligingsidee van Zope in mijn hoofd:
Wie niet bekend is met zope volgt hier een screenshot:
Afbeeldingslocatie: http://www.dentol.nl/got/screenshot-zope.gif

Je geeft dus per object (in mijn geval een node) aan welke rollen de verschillende acties mogen doen.

Hier heb ik ook dus rekekening gehouden met mijn tabel ontwerp zoals in de first post beschreven is.

Maar is dit wel de beste manier?

PS: Otis -> Zou jij misschien een voorbeeldje willen posten van die custom functies die jij hebt geschreven??

[ Voor 4% gewijzigd door PhoneTech op 21-12-2002 18:23 ]


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 12:42
kick

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 12:42
ik heb geduld.......

  • EfBe
  • Registratie: Januari 2000
  • Niet online
PS: Otis -> Zou jij misschien een voorbeeldje willen posten van die custom functies die jij hebt geschreven??
Ik zie niet in waarom ik mn eigen proprietry code moet gaan posten. Ik heb uitgelegd hoe het werkt, lijkt me toch meer dan genoeg? Focus op functionaliteit, zet op een rijtje wat je wilt gaan doen, schrijf uit in fuctionaliteitsbeschrijvingen hoe je denkt het een en ander op te lossen en implementeer dat dan.

Je vraagt 'is dit wel de beste manier?', dat is een vraag waar geen antwoord op te geven is zonder je functionele ontwerp ernaast. Immers: als je je functionele specificaties goed formuleert kun je t.a.t. toetsen of je implementatie 'de beste is', want 'de beste' is die implementatie die de functionele beschrijvingen het dichtst benadert zonder teveel nadelen.

offtopic note: ik heb de afgelopen 2 jaar veel discussies gevoerd mbt kwaliteit van GoT, wat eraan gedaan moest worden, en ben altijd tegen de term 'helpdesker' geweest nu ook nog. Phonetech, wat jij doet hier is in mijn ogen niet de juiste weg. Je kunt niet van anderen verlangen dat ze je handje vasthouden, je implementaties doorlichten of erger: productiecode van zichzelf gaan posten (want dat is nogal uitgebreid). Als je hulp wilt, prima, maar ik denk dat je mans genoeg bent om zelf te toetsen of jouw implementatie je eigen functionele specificatie realiseert of niet en indien niet, wat je eraan moet doen om het wel voor elkaar te krijgen.

offtopic:
ja ik ben van nick veranderd, de redenen ga ik hier niet geven

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

Je maakt gebruik van Zope?

Zope heeft toch al een Role Based security systeem?
http://www.zope.org/Members/lvogel/proxy

Programmer - an organism that turns coffee into software.

Pagina: 1