webForumDet fria alternativet

Angående hantering av användare, roller och login

.NET

18 svar · 778 visningar · startad av CatZ

Medlem sedan jan. 20022 440 inlägg
Frågan#1

För att göra ett eget sånt här system funderar jag på hur jag bör göra egentligen... Tabellerna som behövs är ju inte så svåra

  • Users - Innehåller endast det nödvändigaste, e-post. lösenord osv
  • UserDetails - Här får allt som ska kunna byggas på finnas
  • Roles - Roller behövs ju för att kunna styra åtkomst
  • UserInRole - Här tilldelas användare till roller

Själva dataåtkomsten är ju en "ingenhjärna" (nobrainer) men när det gäller mappning till själva userentity så fungerar inte detta så bra? Antar att det är här en EntityMapper kommer in och räddar dagen (och hjärnan).

Jag har försökt hitta någon bra läsning på ämnet som lämnar membershipprovidern utanför men hittar ingenting. Jag har sökt på lite olika, asp.net +loginsystem, asp.net +handle users, asp.net +user handling och en faslig massa annat.

Någon som hittat någon läsning på ämnet och vill dela med sig?

Medlem sedan jan. 20022 440 inlägg
#2

Jag tror jag fått till det tillsvidare, jag kör med några true/false i databasen och endast en tabell så länge.

Det får duga tillsvidare :)

Medlem sedan maj 20012 812 inlägg
#3

Det du skulle kunna göra är att skipa UserInRoles tabellen och lägga en kolumn i User tabellen där du spara ner vilka roler som en användare tillhör genom bitvis jämföring.

Säg att du har följande roller.
1 = Admin
2 = Manager
4 = Customer
8 = User

Då kan du genom att lägga ihop de olika talen få fram exakt vilka roller som användaren tillhör.

Säg att det stå 3 i User tabellen, då ser man att user tillhör, Admin och Manager. Står det 9 så ser man att Usern tillhör Admin och User.

- M

Medlem sedan jan. 20022 440 inlägg
#4

Det du säger klingar sant i mina öron och jag är inne på det spåret. har experimenterat lite med Enum men det blir för tunt för att göra en vettig lösning med.

Jag tror jag sett ditt förslag tidigare i något annat sammanhang. Just nu är det kaos i mitt huvud. Jag får inte till någonting. Jag gav mig på att läsa om tdd och ddd samt om en massa patterns. Det blev för abstract och självförtroendet fick sig en ordentlig törn men jag är något på spåren igen :) Problemet är ju bara att minska antalet anrop till databasen, då måste det vara vettigare att spara dessa i tex en xml fil väl?

Medlem sedan jan. 20022 440 inlägg
#5

Tror att detta ska fungera om du sedan vill kolla om en användare har tillstånd

        public bool HasPermission(Permissions _permissionToCheck)
        {
            Permissions _permission = (Permissions.All);
            return ((_permissionToCheck & _permission) == _permissionToCheck);
        }

För att binda en användares permissions som ligger som int i databasen får man göra en cast på vägen ut från databasen med

useritem.Permissions = (Permissions)(dr["Permissions"]);

Iofs tror jag att det kanske blir enklare att hantera det som int utom just när man ska jämföra...

Synpunkter? Åsikter?

Medlem sedan maj 20012 812 inlägg
#6

Catz skrev:

Problemet är ju bara att minska antalet anrop till databasen, då måste det vara vettigare att spara dessa i tex en xml fil väl?

Inte ur prestandasynpunkt, då är en databas snabbare, men om du vara vill minska antalet anrop, så är det ju caching som du skall titta och fundera på.

Detta är ett typexempel på information som man läser upp 1 gång och sedan håller man det i minnet för sin applikation, och är det en webbapplikation, så får man lösa det på 2 sätt, antingen i en session, eller en extern cache-applikation där du spara ner information tillsammans med en nyckel, så du kan hämta upp det på nästa sida.

Catz skrev:

Iofs tror jag att det kanske blir enklare att hantera det som int utom just när man ska jämföra...

Japp, precis så blir det.

- M

Medlem sedan jan. 20022 440 inlägg
#7

Gladh skrev:

Detta är ett typexempel på information som man läser upp 1 gång och sedan håller man det i minnet för sin applikation, och är det en webbapplikation, så får man lösa det på 2 sätt, antingen i en session, eller en extern cache-applikation där du spara ner information tillsammans med en

Intressant! Det hade jag inte tänkt på... att man kan göra en extern applikation till cachning, supersmart för stora projekt att ha en webservice eller liknande som sköter det bra mycket säkrare okså jämfört med tex cookies.

Absolut ingenting jag har nytta av i mitt lilla projekt men tänkvärt ändå.

Medlem sedan juni 20003 076 inlägg
#8

Varför inte använda membershipprovidern? :q

Medlem sedan jan. 20022 440 inlägg
#9

Därför att med membershipprovidern är du helt låst till asp.net, jag vill inte utveckla på det viset eftersom jag inte enbart gör hemsidor och då vill kunna he en gemensam lösning oavsett vad presentations lagret är.

Medlem sedan dec. 19996 522 inlägg
#10

En webservice är inte direkt smart för att hantera cachelösningar ur ett prestandaperspektiv. Finns andra alternativ som är bättre.

Medlem sedan dec. 19996 721 inlägg
#11

CatZ skrev:

Därför att med membershipprovidern är du helt låst till asp.net, jag vill inte utveckla på det viset eftersom jag inte enbart gör hemsidor och då vill kunna he en gemensam lösning oavsett vad presentations lagret är.

Det är i sig inte en anledning till att inte använda membershipprovidern, men du kan utnyttja den på ett annat sätt. Bygg inte ett säkerhetssystem som bygger på membershipprovidern, utan en membershipprovider som bygger på ditt säkerhetssystem. En adapter, för att tala i pattern lingo.

I stället för:

MyCustomMembershipProvider.ValidateUser:
->Logik för att validera användaren

..så gör du:
MyCustomMembershipProvider.ValidateUser:
->MyAuthenticationService.ValidateUser

Mao, du använder MyCustomerMembershipProvider för att ditt eget säkerhetssystem ska kunna åka snålskjuts på ASP.NET.

Om du ändå inte vill ha med membership-/role-systemet att göra, och i stället skapa egen forms authentication etc. så kan jag verkligen respektera det, men det kanske kan vara intressant att se providern som en adapter, snarare än något som blir en grundläggande del i ditt säkerhetssystem.

Medlem sedan maj 20012 812 inlägg
#12

Catz skrev:

Intressant! Det hade jag inte tänkt på... att man kan göra en extern applikation till cachning, supersmart för stora projekt att ha en webservice eller liknande som sköter det bra mycket säkrare okså jämfört med tex cookies.

Nja, som erka säger så kanske inte webservices är den bästa lösningen, jag tänkt mig mer att du kör en COM+ pool på din webserver, det kostar ju lite i kraft att korsa processorgränserna, men blir ändå billigare än att hela tiden kalla på databasen.

En webservices tar några tiotals/hundratals ms att anropa och då går det fortare med databasanrop. MEN om du istället har objekt som tar riktigt långtid att fylla med data eller beräkningar som tar långtid att göra så skulle det kanske löna sig att använda en webservice som cache, men jag tror nog ändå mer på en COM+ lösning, även om den kommer komplicera saker för dig om du bygger ett webbkluster, men det finns lösningar på det med :)

- M

Medlem sedan dec. 19996 522 inlägg
#13

OT: Det finns en distribuerad open-source cache som heter memcached som är galet snabb och en portning från unix-varianten (som youtube använder). Den fungerar lika bra att använda även om man inte använder webbkluster. Bara bygga en adapter mot den från din applikation.

Medlem sedan jan. 20022 440 inlägg
#14

emission: sant men du måste fortfarande skapa lösningen :)

Medlem sedan maj 20012 812 inlägg
#15

erka skrev:

OT: Det finns en distribuerad open-source cache som heter memcached som är galet snabb och en portning från unix-varianten (som youtube använder). Den fungerar lika bra att använda även om man inte använder webbkluster. Bara bygga en adapter mot den från din applikation.

Skall titta lite närmare på den, verkar intressant...

- M

Medlem sedan jan. 20022 440 inlägg
#16

Hur ända in i glödheta ska jag använda detta på nåt vettigt sätt? Låt oss säga att jag hämtar min int till User.Permissions det är inga problem men sedan vill jag ha en lista på alla användare och snabbt kunna klicka i tex att användaren är medlem i Admin.

<EditItemTemplate>
	<asp:CheckBox ID="chkAdmin" runat="server" />
</EditItemTemplate>

Det jag behöver kunna göra vid OnRowDataBound (antar jag) är ju en simpel kontroll på User.Permissions.

Ett väldigt enkelt alternativ vore ju att fortfarande spara det som int i databasen men ha det som förut med User.Admin, User.PostResult, User.PostNews när listan skapas. Det vore skönt att hitta den felande pusselbiten dock!

Medlem sedan maj 20012 812 inlägg
#17

Jag förstår nog inte vad du frågar efter, för om det är vad jag tror så har du redan svarat på det tidigare.

private void OnRowDataBound(){
 ....
 chkAdmin.Checked = (User.Permission & Permission.Admin == Permission.Admin);
 chkPostNews.Checked = (User.Permission & Permission.PostNews == Permission.PostNews);
 ...
}

Och när du sedan vill spara det så gör du likadant.

if(chkAdmin.Checked == true)
 user.Permisson = user.Permisson | Permisson.Admin;

- M

Medlem sedan jan. 20022 440 inlägg
#18

Som sagt jag har inte experimenterat än bara funderat, som jag funderade (rent abstrakt) kan jag VERKLIGEN komma åt varje rad i min IList så enkelt under RowDataBound?

I så fall är programmering enklare än vad jag trodde... ;)

Medlem sedan jan. 20022 440 inlägg
#19

Det får bli en ful-lösning istället. Jag skapar en hidden column i gridviewn så jag kan köra en check mot den. (Inte snyggt men det funkar) :)

269 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
144 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)