webForumDet fria alternativet

Allmän inloggnings diskution

.NETur .NET

10 svar · 726 visningar · startad av asmodie

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

Jag tänkte starta en allmän diskution om inloggning och inloggningshantering. Jag vet att det är många som håller på med sådana problem och det är roligt att höra olika personer tankar kring ämnet.

Några delar som skulle vara intresant att höra lite om.

Hur får man en snabb inloggning?
Vad ska man slänga upp i sessionen?
Hur löser man inloggningssäkerhet, vilken användare får vara inne på vilken sida?
Hur löser man problemet med att vara inloggad när man går in på sidan efter det att man stängt ner exploren?

Personlogen är jag intreserad av tips och trix för att förbättra inloggningen.

Så här har jag tänkt lite på det...

Jag vet inte om min inloggning är så speciellt snabb. Men jag läser in användarID, användarnamn och alla de gruppID:n som användaren tillhör. Sedan skickar jag in det i en klass som jag stoppar in i en session. På detta sättet kan jag enkelt kolla om användaren får vara inne på en sida genom att kolla med gruppID:n i sessionen som är startad.

Medlem sedan juni 20019 024 inlägg
#2

Asp.net har ju en inbyggd funktion för skydd av sidor, FormsAuthentication (och Windows Authentication visserligen).

På så vis är det bara att skapa en ny applikation i ISS, redigera web.config med vilken sida som ska vara inloggningssida och vips så är alla sidorna skyddade. Smidigt och enkelt. Det finns ingen anledning att hålla på att skriva egna sessions. Om du nu är ute efter maximal kontroll kan du ju skriva om FormsAuthentication i stället.

För behörighetskontroll (vem som har rätt att visa vilka sidor) har jag byggt en klass som varje codebehind-/aspx-sida ärver och sköter kontrollen där. Så all behörighet kontrolleras automatiskt; när användaren går sidan kontrollerar klassen om användaren har behörighet till den aktuella applikationen. Om inte så visas ett felmeddelande.

För autentiseringen ska jag bygga om FormsAuthentication till att kunna ta emot fler parametrar än bara ett namn. Man ska även kunna dela inloggningen på flera domäner (liknande Microsoft Passport). Men det är ett senare projekt.

Att förhindra inloggning när du har stängt ned webbläsaren är omöjligt, om du inte kör något kryptiskt klientscript (exempelvis javascript som ligger i en egen ram, när du stänger ned så aktiveras "onUnload").

Medlem sedan jan. 2004501 inlägg
#3

Forms Authentication låter intresant, men man saknar helt klart flera parametrar att trycka in. Man vill ju gärna ha med t.ex. användar id för att kolla vissa saker.

Men vad är det som gör Forms Authentication är bättre att starta en egen session som man kan välja precis vad man vill ha med och sedan inkludera ett script på varje sida som kollar rättigheterna och redirectar om folk?

Forms Authentication jag fattar inte riktigt vart man väljer om en användare får gå in på en sida eller inte? Kan de bara kolla om den personen är inloggad eller inte? Men den kan väll inte urskilja vilken användare som får gå in på vilken sida?

Medlem sedan apr. 20012 266 inlägg
#4

Du kan själv, som Pace sa, utöka FormsAuthentication för att passa just dina önskemål. Att det är bättre att använda FormsAuth än Session är lite olika men en sak är t.ex att Sessions lägger sig i minnet medan FormsAuth lägger sin information i kakor.

Mer information på:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/authpro.asp

och kanske på:
http://www.eggheadcafe.com/articles/20020906.asp

Medlem sedan dec. 20003 563 inlägg
#5

Den största skillnaden är väl ändå att formauth är krypterat per default så man slipper sköta den själv.

Medlem sedan jan. 2004501 inlägg
#6

Jag ska ta och göra en djupdykning i FormAuth när jag får tid. Men det låter mycket intresant.

Hur lösern ni problemet med att man vill ha olika användargrupper?

Medlem sedan juni 20019 024 inlägg
#7

asmodie skrev:

Jag ska ta och göra en djupdykning i FormAuth när jag får tid. Men det låter mycket intresant.

Hur lösern ni problemet med att man vill ha olika användargrupper?

Det är klurigt tycker jag, men för tillfället har jag löst det på följande vis:

1. Varje användare är kopplad till en eller flera grupper.
2. Varje grupp är kopplad till en applikation med en viss rättigheter. Jag har skapat fem olika rättighetsnivåer: ingen, läsa, skribent, redaktör och administratör. Namnet säger sig nästan självt.

Låt säga att användaren "Berra" loggar in. Han är kopplad till användargrupperna "Nyhetsredaktör" och "Artikelskribent". Dessa två grupper är kopplade till applikationerna "Nyheter" (med rättigheten "redaktör") respektive "Artiklar" (rättigheten "skribent"). Alltså, Berra är redaktör för nyheter och skribent för artiklar. På så vis styrs vad han kan göra med nyheterna eller artiklarna.

asmodie skrev:

Men vad är det som gör Forms Authentication är bättre att starta en egen session som man kan välja precis vad man vill ha med och sedan inkludera ett script på varje sida som kollar rättigheterna och redirectar om folk?

Forms Authentication jag fattar inte riktigt vart man väljer om en användare får gå in på en sida eller inte? Kan de bara kolla om den personen är inloggad eller inte? Men den kan väll inte urskilja vilken användare som får gå in på vilken sida?

Stämmer. FormsAuth kollar bara så att du är inloggad. Är du inte det så skickas du till en inloggningssida.

Men fördelen med ett objektorienterat språk är ju att det går att ändra objekt själv så att det passar dina behov! Så här ser exempelvis en vanlig sida ut på mitt intranät:

[b]VB[/b]
Imports ...
Imports VoodooFilm.Intranet

Public Class Frontpage : Inherits PageBase.StandardPage

   Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) _
   Handles MyBase.Init
      Me.PageTitle = "Startsidan"
   End Sub
End Class

[b]C#[/b]
Import ...;
Import VoodooFilm.Intranet;

public class Frontpage : PageBase.StandardPage
   void Page_Init(System.Object sender, System.EventArgs e) 
   [red]Handles MyBase.Init = vet jag inte översättningen till ;)[/red]
      this.PageTitle = "Startsidan";
   }
}

Mer kod behöver jag inte för att skapa en sida som bara vissa grupper har åtkomst till. I "StandardPage" sköts all logik. Exempelvis räcker det med raden Me.PageTitle = "Startsidan" för att sätta rubriken på sidan. Mallar och dylikt laddas automatiskt via StandardPage-klassen.

Vad gäller kontroll av behörighet så kontrolleras att användaren är inloggad (automatiskt via FormsAuth), sedan kontrolleras vem som är inloggad (hämta ID-nummer), och slutligen om användaren har behörighet till sidan (jämför användarens ID-nummer med användagrupperna som är kopplade till applikationen).

Detta sker I "StandardPage" som är en ärvd till min aspx-sida (som i sin tur är ärvd från System.Web.UI.Page). På detta vis slipper jag se all kod om vilken sida man har behörighet till och kan koncentrera sig på det väsentliga i stället - att visa det som ska visas på startsidan. ;)

Medlem sedan dec. 200283 inlägg
#8

I många av mina sidor vill jag visa samma sidor för både användare och administratörer med skillnaden att administratören har tillgång till lite fler funktioner (typ redigera, radera osv.)

Hur går jag tillväga för att göra denna typ av applikation med formsauth när den normalt sätt kräver att man är inloggad för att ens komma åt sidorna inom applikationen?

Medlem sedan juni 20019 024 inlägg
#9

FormsAuth är fel objekt att använda för den saken. Den ser bara till att hantera inloggningen, sedan får man själv skapa objekt för vad som ska och inte ska visas.

Skapa exmepelvis ett eget, skräddarsytt objekt som du kallar på ifrån dina sidor och skicka med användarinformation som parametrar. Retunera sedan behörigheten för vad användaren kan göra. Det finns givetvis bättre och mer modulära sätt att hantera detta på, men det borde ge en hint om hur du ska gå tillväga.

Exempel:

Dim CanEdit, CanDelete As Boolean
With New PermissionLevel
   .UserID  = 3
   .Name = "Admin"
   CanEdit = .CanEditPost
   CanDelete = .CanDeletePost
End With
Medlem sedan jan. 2004501 inlägg
#10

Ska man då lägga upp den delen i en session?
Jag har gjort det skapat en SessionData-klass
Som mer eller mindre innehåller AnvID, Och gruppID...
Sendan kollar jag mot en databas som heter securityToGroup där jag har ett säkerhetsID som jag kan ge sidan/klassen och kollar sedan vilket GroupID som har vilken rättighet. Och jag har fyra kategorier view, edit, delete och create. Har har användaren någon sådan rad så får han inte läsa den. Är användaren med i två grupper och den ena har view och edit och den andra har view och delete så får användaren rättigheter till view, edit och delet... Sedan har jag en pub flagga på säkerhet om den ska vara publik...

Så här ser min session data klass ut

C#

		private static string screenName;
		private static int userID;
		private static int[] groupID;

		public string ScreenName
		{
			get { return screenName; }
			set { screenName = value;}
		}

		public int UserID
		{
			get { return userID; }
			set { userID = value;}
		}

		public int[] GroupID
		{
			get { return groupID; }
			set { groupID = value; }
		}

Jag hoppas att det inte bara är jag som tycker att denna diskution är intressant...

Medlem sedan jan. 2004501 inlägg
#11

Ingen som har något mer att säga i denna diskution?

136 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)