/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Session objektet
Fra : Jørgen Olesen


Dato : 01-10-07 21:55

Jeg har lavet et medlemssystem hvor jeg sætter forskellige
session objekter når brugeren logger ind og det fungere ganske
udemærket.
Ja, det vil sige; nu ville jeg så ændre session.timeout fra de
standard 20 minutter,og så støder jeg panden på en mur.
Min udbyder tillader ikke at jeg ændre på timeout, argh!!
De foreslår istedet at jeg bruger SessionID.
Og så kan jeg ikke lige gennemskue hvordan jeg kommer videre.

Mit setup er nogenlunde således:
Idag indtaster folk deres brugernavn og password, de checkes op
mod en access database, hvis login er ok sættes flg. session
objekter:
Session("Login")="OK"
Session("UserID")=1000 (Medlemsnummer)
Session("MemberType")=1 (en værdi ml 1-5 afhængig af medlemtype)
Disse objekter checker jeg så løbende på mine sider for at
brugeren får de sider han har adgang til.

Men hvordan gør jeg hvis jeg skal bruge SessionID?


--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Erling Sørensen (01-10-2007)
Kommentar
Fra : Erling Sørensen


Dato : 01-10-07 23:24


"Jørgen Olesen" <nomail@nomail.com> skrev i en meddelelse
news:47015e94$0$90276$14726298@news.sunsite.dk...

> Ja, det vil sige; nu ville jeg så ændre session.timeout fra de
> standard 20 minutter,og så støder jeg panden på en mur.
> Min udbyder tillader ikke at jeg ændre på timeout, argh!!

Det nemme svar: Skift udbyder:)

> De foreslår istedet at jeg bruger SessionID.
> Og så kan jeg ikke lige gennemskue hvordan jeg kommer videre.

ThisSessionId = Session.SessionID


> Mit setup er nogenlunde således:
> Idag indtaster folk deres brugernavn og password, de checkes op
> mod en access database, hvis login er ok sættes flg. session
> objekter:
> Session("Login")="OK"
> Session("UserID")=1000 (Medlemsnummer)
> Session("MemberType")=1 (en værdi ml 1-5 afhængig af medlemtype)
> Disse objekter checker jeg så løbende på mine sider for at
> brugeren får de sider han har adgang til.
>
> Men hvordan gør jeg hvis jeg skal bruge SessionID?

En løsning kunne være at du laver en tabel indeholdende sessionID, UserID og
MemberType
Den skriver du en record i, når brugeren er blevet valideret på din login
side.
Hvis session.timeout så bliver overskredet, kan du jo dykke ned i din
database og lede efter en matchende sessionID.
Hvis den findes, sætter du bare et nyt sæt session variabler med værdierne
fra basen.
Ved logout sletter du records igen.
Der vil efter al sandsynlighed ophobes nogle records i den tabel over tid.
Bl.a. kan man ikke forvente at brugerne logger pænt af hver gang.
Men så kan du jo registrere login tiden i tabellen også, og køre en
oprydning af gamle sessionID'er med faste mellemrum.
Det kan f.eks være en del af login siden.

/Erling



Michael Weber (02-10-2007)
Kommentar
Fra : Michael Weber


Dato : 02-10-07 00:13


"Erling Sørensen" <erling_deletethis@nvn.dk> skrev i en meddelelse news:47017391$0$9971$edfadb0f@dread16.news.tele.dk...
>
> "Jørgen Olesen" <nomail@nomail.com> skrev i en meddelelse
> news:47015e94$0$90276$14726298@news.sunsite.dk...
>
> > Ja, det vil sige; nu ville jeg så ændre session.timeout fra de
> > standard 20 minutter,og så støder jeg panden på en mur.
> > Min udbyder tillader ikke at jeg ændre på timeout, argh!!
>
> Det nemme svar: Skift udbyder:)
>
> > De foreslår istedet at jeg bruger SessionID.
> > Og så kan jeg ikke lige gennemskue hvordan jeg kommer videre.
>
> ThisSessionId = Session.SessionID
>
>
> > Mit setup er nogenlunde således:
> > Idag indtaster folk deres brugernavn og password, de checkes op
> > mod en access database, hvis login er ok sættes flg. session
> > objekter:
> > Session("Login")="OK"
> > Session("UserID")=1000 (Medlemsnummer)
> > Session("MemberType")=1 (en værdi ml 1-5 afhængig af medlemtype)
> > Disse objekter checker jeg så løbende på mine sider for at
> > brugeren får de sider han har adgang til.
> >
> > Men hvordan gør jeg hvis jeg skal bruge SessionID?
>
> En løsning kunne være at du laver en tabel indeholdende sessionID, UserID og
> MemberType
> Den skriver du en record i, når brugeren er blevet valideret på din login
> side.
> Hvis session.timeout så bliver overskredet, kan du jo dykke ned i din
> database og lede efter en matchende sessionID.

Matchende med hvad ?

Prøv at opdatér en side efter 2 minutter, indeholdende :

<%
Session.Timeout = 1
Response.Write Session.SessionID
%>

Hvis din variabelThisSessionId (længere oppe) er en session-variabel vil den blive tildelt et nyt
SessionID og det vil ikke matche noget SessionID, i nogen tabel.

Måske jeg har misforstået din løsning.

> Hvis den findes, sætter du bare et nyt sæt session variabler med værdierne
> fra basen.
> Ved logout sletter du records igen.
> Der vil efter al sandsynlighed ophobes nogle records i den tabel over tid.
> Bl.a. kan man ikke forvente at brugerne logger pænt af hver gang.
> Men så kan du jo registrere login tiden i tabellen også, og køre en
> oprydning af gamle sessionID'er med faste mellemrum.
> Det kan f.eks være en del af login siden.
>
> /Erling
>
>

Med venlig hilsen
Michael Weber

Erling Sørensen (02-10-2007)
Kommentar
Fra : Erling Sørensen


Dato : 02-10-07 06:16


"Michael Weber" <michael@removemichaelweber.dk> skrev i en meddelelse
news:47017ea1$0$63789$edfadb0f@dread14.news.tele.dk...

>> Hvis session.timeout så bliver overskredet, kan du jo dykke ned i din
>> database og lede efter en matchende sessionID.

>Matchende med hvad ?

>Prøv at opdatér en side efter 2 minutter, indeholdende :
><%
> Session.Timeout = 1
> Response.Write Session.SessionID
>%>

Du har fuldkommen ret.
Jeg tog det egentlig for givet, at sessionID fangede Session ID fra
klientens request.
Som du konstaterede r det ikke tilfældet. Beklager det forkerte svar.
Til gengæld kan man så bruge HTTP_COOKIE, som er den jeg egentlig troede
sessionID refererede til:
Prøv
<%
session.Timeout = 1
thissessionid = session.sessionID
http_cookie = Request.ServerVariables("HTTP_COOKIE")
response.write "Session ID: " & thissessionid & "<br>" & "Cookie: " &
http_cookie
%>
Som det ses, er der ikke nogen HTTP_COOKIE ved første hit.
Kan så løses med

if not session("cookie_set") then
session("cookie_set") = True
response.redirect("thisfile.asp")
end if

>Måske jeg har misforstået din løsning.

Det tror jeg egentlig ikke du har. Den duede bare ikke.


/Erling



Michael Weber (02-10-2007)
Kommentar
Fra : Michael Weber


Dato : 02-10-07 23:56


"Erling Sørensen" <erling_deletethis@nvn.dk> skrev i en meddelelse news:4701d41f$0$93811$edfadb0f@dread16.news.tele.dk...
>
> "Michael Weber" <michael@removemichaelweber.dk> skrev i en meddelelse
> news:47017ea1$0$63789$edfadb0f@dread14.news.tele.dk...
>
> >> Hvis session.timeout så bliver overskredet, kan du jo dykke ned i din
> >> database og lede efter en matchende sessionID.
>
> >Matchende med hvad ?
>
> >Prøv at opdatér en side efter 2 minutter, indeholdende :
> ><%
> > Session.Timeout = 1
> > Response.Write Session.SessionID
> >%>
>
> Du har fuldkommen ret.
> Jeg tog det egentlig for givet, at sessionID fangede Session ID fra
> klientens request.
> Som du konstaterede r det ikke tilfældet. Beklager det forkerte svar.

Tjaee....du er inde på noget rigtigt, nemlig at serveren gemmer session-data i cookies, hvis den kan slippe afsted med det i.e.
klientens browser tillader det.
Men denne cookie er en session-cookie, der slettes når sessionen udløber.

Prøv at afvikle ovenstående kode lokalt i f.eks. Mozilla ( og kig i Cookie-manageren->.Stored Cookies (Site = localhost))
Læg i øvrigt mærke til at SessionID tælles op med 1 ved generering af nyt SessionID.
Prøv dernæst at Blokerer for cookies fra Localhost og se at der generes nyt SessionID hvre gang siden opdateres, på trods af
Session.Timeout perioden.

Grunden til at session-cookies indeholdende en hashed sessionid udløber ved session-slutning, er formentlig fordi serveren kun anser
sessionid´s for unikke i applikationens levetid og ikke ultimativt unikke.
Hvis serveren f.eks. genstartes, er kollision på SessionID teoretisk muligt, hvilket vil betyde at
2 brugere kan benytte samme SessionID som nøgle, hvis dette er gemt f.eks. som nøgle i en database.

Eksempel :

SessionID er 2001
ny bruger får SessionID 2001
ny bruger får SessionID 2002
o.s.v.

Antager at serveren genstartes.

Nu er det teoretisk muligt at serveren starter SessionID-tælleren ved f.eks. 2001
ny bruger får SessionID 2001
ny bruger får SessionID 2002

Ups...kollision, hvis man har brugt SessionID i databasen.
F.eks. hvis man gemmer SessionID i en Cookie, der udløber i 2008 og
bruger samme cookie til automatisk at logge ind på sitet.
Derfor fraråder MS at bruge SessionID som f.eks. nøgle i databaser.

Læs mere om cookies her :
http://msdn2.microsoft.com/en-us/library/ms972338.aspx

Med venlig hilsen
Michael Weber


Jørn Andersen (03-10-2007)
Kommentar
Fra : Jørn Andersen


Dato : 03-10-07 00:39

On Wed, 3 Oct 2007 00:55:40 +0200, "Michael Weber"
<michael@removemichaelweber.dk> wrote:

>Eksempel :
>
>SessionID er 2001
>ny bruger får SessionID 2001
>ny bruger får SessionID 2002
>o.s.v.
>
>Antager at serveren genstartes.
>
>Nu er det teoretisk muligt at serveren starter SessionID-tælleren ved f.eks. 2001
>ny bruger får SessionID 2001
>ny bruger får SessionID 2002

Det sker svjv også, når man når det øverste tal, som
"SessionId-generatoren" kan levere - så starter den forfra.

>Ups...kollision, hvis man har brugt SessionID i databasen.
>F.eks. hvis man gemmer SessionID i en Cookie, der udløber i 2008 og
>bruger samme cookie til automatisk at logge ind på sitet.
>Derfor fraråder MS at bruge SessionID som f.eks. nøgle i databaser.

En workaround er at gemme en dato-tid s.m. SessionId - fx (i
pseudo-kode):
strMyString = SessionId & "20071003013830"


Mvh. Jørn

--
Jørn Andersen,
Brønshøj

Erling Sørensen (03-10-2007)
Kommentar
Fra : Erling Sørensen


Dato : 03-10-07 23:13


"Michael Weber" <michael@removemichaelweber.dk> skrev i en meddelelse
news:4702cc2c$0$2105$edfadb0f@dread15.news.tele.dk...

>> Du har fuldkommen ret.
>> Jeg tog det egentlig for givet, at sessionID fangede Session ID fra
>> klientens request.
>> Som du konstaterede r det ikke tilfældet. Beklager det forkerte svar.

> Tjaee....du er inde på noget rigtigt, nemlig at serveren gemmer
> session-data i cookies, hvis den kan slippe afsted med det i.e.
> klientens browser tillader det.
> Men denne cookie er en session-cookie, der slettes når sessionen udløber.

Som jeg allerede har kostateret ovenfor. Du har ret.
HTTP header cookies opfører sig dog anderledes. Se længere nede i svaret.

> Prøv at afvikle ovenstående kode lokalt i f.eks. Mozilla ( og kig i
> Cookie-manageren->.Stored Cookies (Site = localhost))
> Læg i øvrigt mærke til at SessionID tælles op med 1 ved generering af nyt
> SessionID.
> Prøv dernæst at Blokerer for cookies fra Localhost og se at der generes
> nyt SessionID hvre gang siden opdateres, på trods af
> Session.Timeout perioden.

Du har helt ret. Det er dog irellevant for spørgsmålet hvad der sker hvis
man blokerer for cookies.
Jørgen, starteren af denne tråd, bruger allerede session cookies til login,
så uden cookies er hans site ubrugelig alligevel.

> Grunden til at session-cookies....

[snip en hel masse om sessionID]

Igen. Du har ret. SessionID kan ikke bruges i denne forbindelse.

Som jeg allerede konstaterede i mit sidste indlæg, er det HTTP_COOKIE som er
en mulighed.

Prøv lige
<%
response.write "SessionID: " & session.sessionID & "<br>" &
"HTTP_COOKIE: " & Request.ServerVariables("HTTP_COOKIE")
session.Abandon()
%>
Du vil få et nyt SessionID ved hver reload af siden, men din HTTP_COOKIE vil
forblive den samme.

Klienten er ikke vidende om at der findes en session på serveren med et
tilhørende SessionID. Klienten får i stedet tildelt en HTTP_COOKIE ved
første hit på siden, Denne sendes med ved alle efterfølgende requests.
Serveren sammenholder så HTTP_COOKIE med en tilhørende session, og finder ud
af om Timeout er overskredet.
Hvis Timeout er overskredet, skabes en ny session på serveren. Et nyt
SessionID dannes, og denne bindes til den eksisterende HTTP_COOKIE fra
klienten.

HTTP_COOKIEs fastholdes på tværs af server sessions indtil browseren lukkes.
Derfor mit forslag til Jørgen om at kigge på denne.

Dette er gældende (Testet) på IIS 5 og IIS 6. Det kan sagtens fungere
anderledes på f.eks. Apache eller andre webservere.
Det gælder for (Testet) IE7, Firefox 2 og Opera 9

Om Jørgen så kan bruge det til noget, må stå hen i det uvisse. Der er jo
ikke kommet meget respons fra ham endnu.

/Erling



Jørn Andersen (02-10-2007)
Kommentar
Fra : Jørn Andersen


Dato : 02-10-07 02:46

On 01 Oct 2007 20:54:44 GMT, Jørgen Olesen <nomail@nomail.com> wrote:

>Jeg har lavet et medlemssystem hvor jeg sætter forskellige
>session objekter når brugeren logger ind og det fungere ganske
>udemærket.
>Ja, det vil sige; nu ville jeg så ændre session.timeout fra de
>standard 20 minutter,og så støder jeg panden på en mur.

Hvorfor vil du ændre .TimeOut - ?

>Min udbyder tillader ikke at jeg ændre på timeout, argh!!

Dårlig udbyder.
Men har du afprøvet i praksis om den kan ændres?


Mvh. Jørn

--
Jørn Andersen,
Brønshøj

Erling Sørensen (02-10-2007)
Kommentar
Fra : Erling Sørensen


Dato : 02-10-07 06:36


"Jørn Andersen" <jorn@jorna.dk> skrev i en meddelelse
news:7j83g31nujofal5u7ppq6erms7r57jrvqs@4ax.com...

> Hvorfor vil du ændre .TimeOut - ?

Det kan der jo være så mange grunde til.
Selv har jeg en gang lavet et site med forskellige brugergrupper, med hver
deres TimeOut.
5 min. til administratorer, 20 min. til forfattere, 60 min. til almindelige
brugere.
Helt efter kundens ønsker.

/Erling



Christian R. Larsen (02-10-2007)
Kommentar
Fra : Christian R. Larsen


Dato : 02-10-07 08:36

"Jørgen Olesen" <nomail@nomail.com> wrote in message
news:47015e94$0$90276$14726298@news.sunsite.dk...
> Jeg har lavet et medlemssystem hvor jeg sætter forskellige
> session objekter når brugeren logger ind og det fungere ganske
> udemærket.
> Ja, det vil sige; nu ville jeg så ændre session.timeout fra de
> standard 20 minutter,og så støder jeg panden på en mur.
> Min udbyder tillader ikke at jeg ændre på timeout, argh!!
> De foreslår istedet at jeg bruger SessionID.
> Og så kan jeg ikke lige gennemskue hvordan jeg kommer videre.

Hvad er problemet - at sessionen udløber for tidligt, hvis folk slipper
tastaturet?



Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409080
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste