04. juni 2004 - 20:22Der er
129 kommentarer og 1 løsning
Kan man have 2 logins og 2 cookies på samme domæne?
En bruger kommer ind på www.minside.dk og får mulighed for at logge ind 2 steder.
Så vidt jeg har forstået det, kan man ikke holde 2 cookies, der bruges til login, hvis de ligger på samme domæne. De skal enten ligge på hvert sit domæne, eller den ene på selve domænet, og den anden på et subdomæne.
Nu har jeg så set i Frontpage, at man kan oprette et nyt websted. Jeg har et ønske om, at brugeren skal logge ind på www.minside.dk eller på www.minside.dk/nyt_websted fra forsiden. Kan det lade sig gøre, eller vil cookien benytte samme informationer, når der logges på enten det ene eller det andet sted?
Den er lidt kringlet formuleret, jeg ved det. Men kan dette lade sig gøre, uden at informationerne fra de 2 cookies bliver de samme?
Men hvis jeg lægger min dolog.asp ned i hhv. www.minside.dk og www.minside.dk/nyt_websted, så er jeg da bange for, at oplysningerne fra det ene sted, vil blive trukket frem i textfelterne det andet sted. Tror jeg da :o)
Og ellers, for at adskille forskellige sider som der logges ind fra, er der så ikke noget " $_SERVER["REQUEST_URI"] " i asp? Altså som så vil være f.eks. /spm/506180
Hvis browseren kun er sat op til at hente cookies fra ét domæne ad gangen, kan jeg vel heller ikke lave det på sådan en måde, at brugeren benytter 2 seperate cookies til hvert sit websted, begge dannet fra forsiden?
"Men i dag er browsere pr. default sat op til kun at acceptere cookies fra et domain ad gangen."
Hvis jeg prøver på at sætte en cookie fra et domæne til et andet, bliver den pr. default ikke accepteret. (der skal mere kode bag, end blot at sætte en cookie)
Men vil du lave cookies for dit domæne og undermapper, så kan du sagtens gøre det,
Jeg ville sige, at det er en dårlig/bøvet måde at gøre det på..
Jeg ville ha' gjort sådan her:
--
Dim Conn, RS ' normalt bruger jeg: if request.servervariables("request_method") = "POST" then ' som checker om man lige har submittet en form.. f.eks. en login-form
Set RS = Conn.Execute("SELECT userID, username, pass FROM profiles WHERE usernamedb = '" & strBruger & "' and passworddb = '" & strKode & "'"
if not(rs.bof or rs.eof) then ' brugeren er fundet.. else 'brugernavn eller kodeord er forkert.. response.write "brugnavn eller kodeord er forkert" end if
' kode til at lukke forbindelsen til database, indsættes her.
--
Der er er 2 meget vigtige ting man skal huske, når man arbejder med login, og databaser:
1) Erstat *altid* tegnet ' med enten ingenting, eller 2 gange ', som opfattes som et enkelt ' tegn.. Grunden til det er, at hvis man kender enten brugernavn, eller kodeord, kan man logge ind, bare ved at erstatte det ukendte med: ' or '' = ' Nu har du så godt nok, brugt noget jeg ikke har testet: SQLEncode(Request("username"))
2) Fejlmeddelelsen. Fortæl aldrig brugeren, om det er brugernavnet eller kodeordet der er forkert.. hvis brugeren finder et brugernavn, men ikke password, kan han/hun forsøge sig med punkt 1. Derfor: response.write "brugnavn eller kodeord er forkert" (eller)
Ok, men det bliver så også fjernet med en Replace. Hvad du ikke kan se er, at der er inkluderet en functions.asp øverst, som tager sig af det :o)
Det ser fornuftigt ud. Jeg prøver lige at sammenfatte det og smider resultatet her lige om lidt.
Jeg får ikke mulighed for at teste det af før om en uge eller to. Men jeg går ud fra, at det er ok. Ellers vender jeg tilbage :o)
Kan du ikke smide et svar? thesurfer får 100 for at levere løsningen, powernodes får 20, fordi han var inde på det rigtige. Så jeg mangler også lige et svar fra powernodes :o)
Hvordan skal det så sættes op? Jeg mener: Jeg har en forside med 2 formularer (login). Koden, som jeg lagde ud med, har været brugt til ét login på samme domæne, og det lå ude i roden.
Nu har jeg oprettet et nyt websted, som forhåbentlig kan holde de to cookies adskilt. Hvordan skal det rent praktisk foregå? Kan jeg bruge dette ene script til begge logins, eller hvordan?
Du kan godt lave 1 side, med login til 2 steder.. du skal bare checke hvilken side du er på..
Det kan f.eks. gøres med:
if InStr(LCase(request.servervariables("script_name")), "/nyt_websted") then ' koden/cookien til "/nyt_websted" indsættes her else ' koden/cookien til "www.minside.dk" indsættes her end if
Disse navne er ikke noget jeg plejer at bruge.. det var for at du kunne se, hvad det var.. :-) Bare så man ikke forvekslede dem med input-felter, variabler, osv..
Jeg har prøvet at rette koden lidt til. Håber du lige vil rende den igennem. Bagefter prøver jeg lige at se, om jeg kan få sat det rigtigt op til de to cookies.
I fremtiden ville det være en god ide, at ersatte stien+navnet på databasen, med noget andet.. f.eks. "***". Hvis du f.eks. har database filen liggende sammen med asp filen, kan database nemt downloades (man skriver bare navnet på databasefilen), og dine password ville afsløret..
Så jeg tror at du har misforstået det.. En anden ting: i urls (stier og filnavne) bruges ikke " " (mellemrum), "ø,æ,å", "STORE bogstaver" det med "STORE bogstaver" gælder, hvis serveren er Linux, da der er forskel på store og små bogstaver..
Eksempel: "opret.asp" er *ikke* det samme som "oprEt.asp"! (samme bogstaver, men store/små)
- By the way.. denne linie skal så fjernes, da du har den anden:
Set RS = Conn.Execute("SELECT userID, username, pass FROM profiles WHERE username = '" & SQLEncode(Request("username")) & "'")
- Alle request*("et eller andet") skal fixes.
- Du mangler ("mode") her: If Request.QueryString = "enduser" Then Og du skriver godt nok "Din+profil+er+blevet+slettet", men du sletter ikke profilen.
- Jeg går ud fra, at "CutStr" er et objekt som oprettes..
"Det var det der med at bruge strBruger og strKode. De skal indsættes i alle dine SQL-strenge, der sammenligner brugernavn og/eller kodeord."
Det mener jeg helt bestemt, at denne funktion gør?
Function SQLEncode(strSQL) SQLEncode = Replace(strSQL,"'","''") End Function
Kommentar: thesurfer 05/06-2004 10:42:08
Jeg er sikker på, at jeg helt forstår hvad du mener, for jeg mener ikke man kan se stiangivelsen til databasen via et VB-script? Desuden er det kun databaser, der bliver gemt i mappen, og jeg har forsøgt at downloade en DB via MSIE ved at angive navn og nøjagtig sti. Det kunne ikke lade sig gøre - heldigvis :o) Grunden til at jeg lige satte denne linie ind:
var fordi jeg ikke lige kunne huske den man normalt bruger. Jeg bruger ikke STORE bogstaver, og jeg bruger ikke æ, ø og å. Jeg kan godt finde på at bruge mellemrum i et mappenavn, da mellemrum erstattes med %20 i adresselinien i browseren. Jeg anvender et script, som f.eks. udskriver
CONTEXT: \\ mitdomæne \ opret bruger
- lidt á la her på Eksperten:
Du er her : Eksperten : Spørgsmål & Svar : Programmering : Script : ASP : Kan man have 2 logins og 2 cookies på samme domæne? :
For at kunne udskrive "opret bruger", laver jeg mellemrum i navnet, da scriptet tager mappenavnet. Men har du en bedre idé, eller ligger du inde med noget færdigt, som kan det samme, kan jeg oprette et nyt spørgsmål med nye point :o) Principielt har jeg heller ikke anvendt mellemrum, men nu faldt jeg over dette script :o)
Kommentar: thesurfer 05/06-2004 11:02:42
Jeg REM'er denne her ud :o) Set RS = Conn.Execute("SELECT ......
Mht. enduser, så slettes profilen fra en deleteprofile.asp Response.Redirect "/dolog.asp?enduser" - så den skulle være ok :o)
Mht. CutStr, så er den også i functions.inc:
Function CutStr(str,vLength) If len(str) < vLength Then CutStr = str Else CutStr = Left(str,vLength - 3) & "..." End If End Function
Det er for at komme det problem til livs, at hvis en bruger skriver mononatriumglutaminat i en celle, der er meget small, så kortes ordet ned, så det ikke forrykker hele tabellen. I det her tilfælde bliver det anvendt, hvis en bruger kommer fra en URL, der har en længde på mere end 150 karakterer.
Det var en ordentlig omgang :o) Jeg vil lige se, om jeg kan fixe alle Request("et-eller-andet"). Indtil videre har jeg KUN rem'et denne ud
'Set RS = Conn.Execute("SELECT userID, username, pass FROM profiles WHERE username = '" & strBruger & "' and pass = '" & strKode & "'"
Bortset fra at man kan have ' tegnet i brugernavn og password..
Jeg vil se om jeg får tid, til at kigge på din sidste kode.. jeg er lidt bagud, da jeg har flere projekter kørende.. og så er der noget In Real Life, der kræver opmærksomhed.. *suk* :-)
Jeg glemte noget væsentligt, og det er denne, som er på forsiden:
<% If Session("username") = "" And Request.Cookies("LoginInfo")("autologin") = "true" Then Response.Redirect "/include family/dolog.asp?mode=login&username=" & Request.Cookies("LoginInfo")("username") & "&pass=" & Request.Cookies("LoginInfo")("password") & "&autologin=autologin" End If %>
Den anden skal vel se sådan her ud?
<% If Session("username") = "" And Request.Cookies("LoginInfo")("autologin") = "true" Then Response.Redirect "/include/dolog.asp?mode=login&username=" & Request.Cookies("LoginInfo")("username") & "&pass=" & Request.Cookies("LoginInfo")("password") & "&autologin=autologin" End If %>
surfer, jeg har problemer med, at jeg hele tiden indtaster forkert password. Nærmest som om scriptet sammenligner det indtastede password med ingenting ....?
Der mangler en ) i denne linie
Set RS = Conn.Execute("SELECT userID, username, pass FROM profiles WHERE username = '"&strBruger&"' AND pass='"&strKode&"'"
Den skal vel stå til allersidst i linien?
Set RS = Conn.Execute("SELECT userID, username, pass FROM profiles WHERE username = '"&strBruger&"' AND pass='"&strKode&"'")
Ja, ellers ville du få en fejl. - Men hvordan ser koden til strBruger og strKode ud? - Og hvor er den placeret? (udenfor en kodeblok, inde i en if, .. skriv koden)
If Request.Cookies("logininfo")("autologin") <> "true" AND _ Request.Cookies("logininfo")("username") <> "" AND _ Request.Cookies("logininfo")("password") <> "" Then _ Response.Write "checked"
If Request.Cookies("logininfo")("autologin") <> "true" AND _ Request.Cookies("logininfo")("username") = "" AND _ Request.Cookies("logininfo")("password") = "" Then _ Response.Write "checked"
%>"> Vil ikke huskes <p><input type="submit" value="Luk mig ind!" class="input2"><br><br><br> <a href="/include family/adgangskode/" style="width: 100%; display: block;" title="Få tilsendt din adgangskode" onFocus="this.blur();"><b>Jeg har glemt min adgangskode!</b></a><br> <b>Endnu ikke registreret som bruger?</b><br> <a href="/include family/ny bruger/" style="width: 100%; display: block;" title="Registrer dig som bruger" onFocus="this.blur();"><b>Klik her!</b></a> </td> </form>
Du har kommet til at forveksle de 2 password felter, på din side :-) Hvis brugernavn og kodeord ikke skal være case-sensitive (dvs, der skal ikke være forskel på store/små bogstaver):
Scriptet genererer et password på 8 karakterer med en blanding af store og små bogstaver, som både bliver smidt ned i databasen og sendt med mailen ved oprettelse af profil.
if InStr(LCase(request.servervariables("script_name")), "/nyt_websted") then ' koden/cookien til "/nyt_websted" indsættes her else ' koden/cookien til "www.minside.dk" indsættes her end if
"koden/cookien" inkludere "loginfo_root" og "loginfo_nytwebsted"
Lige inden jeg vil studere øjenlågene indefra: Nu virker cookien til det ene sted. Den burde måske hedde "nyt_websted", og den anden "websted"?
thesurfer, du har gjort en fantastisk indsats, og det haster ikke mere end det jawer. Så når du en gang føler du opsat på at gå i krig med det, vil jeg bare være glad :o)
if InStr(LCase(request.servervariables("script_name")), "/nyt_websted") then ' koden/cookien til "/nyt_websted" indsættes her (Hvor starter og slutter koden?) else ' koden/cookien til "www.minside.dk" indsættes her (Hvor starter og slutter koden?) end if
Jeg kom til at tænke på, at muligheden for automatisk login ikke skal være mulig. Ellers kan man jo kun logge ind i det ene forum, medmindre man logger af det andet først. Eller ...?
Det der skal stå i IF-blokken, er specifikt til det respektive område. Alt andet skal stå uden for IF-blokken. "Områder" er "mindside.dk" og "minside.dk/nyt websted"
Eksempel: ' Disse koder er globale koder, da begge områder skal bruge dem: ' Hvis Dim Conn, RS
If Request("mode") = "login" Then
Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Websider\resadmin\mydomain.dk\mydomain.dk\www\fpdb\db.mdb"
Dim strBruger, strKode
if InStr(LCase(request.servervariables("script_name")), "/nyt_websted") then
' kode specifikt til "minside.dk/nyt_websted" indsættes her: '... <kode>.Cookies("loginfo_nytwebsted") = ... ' cookie sættes
else
' kode specifikt til "minside.dk" indsættes her: '... <kode>.Cookies("loginfo_root") = ... ' cookie sættes 'osv
Jeg kan sagtens se det smarte i det, det var det jeg gerne ville opnå. Det jeg helt nøjagtigt vil vide er, om det kun er
Select Case Request("autologin")
- jeg skal have fat i?
Nu prøver jeg at omskrive det lidt:
If InStr(LCase(Request.Servervariables("SCRIPT_NAME")), "/nyt websted") Then
Select Case Request("autologin") Case "autologin" Response.Cookies("LoginInfo/nyt websted/") = .........? Response.Cookies("LoginInfo").Expires = Now + 365 Response.Cookies("LoginInfo")("autologin") = "true" Response.Cookies("LoginInfo")("username") = Session("username") Response.Cookies("LoginInfo")("pass") = RS("pass") Case "remember" Response.Cookies("LoginInfo").Expires = Now + 365 Response.Cookies("LoginInfo")("autologin") = "" Response.Cookies("LoginInfo")("username") = Session("username") Response.Cookies("LoginInfo")("pass") = RS("pass") Case Else Response.Cookies("LoginInfo").Expires = Now Response.Cookies("LoginInfo")("autologin") = "" Response.Cookies("LoginInfo")("username") = "" Response.Cookies("LoginInfo")("pass") = "" End Select
Else
Select Case Request("autologin") Case "autologin" Response.Cookies("LoginInfo_root") = ...........? Response.Cookies("LoginInfo").Expires = Now + 365 Response.Cookies("LoginInfo")("autologin") = "true" Response.Cookies("LoginInfo")("username") = Session("username") Response.Cookies("LoginInfo")("pass") = RS("pass") Case "remember" Response.Cookies("LoginInfo").Expires = Now + 365 Response.Cookies("LoginInfo")("autologin") = "" Response.Cookies("LoginInfo")("username") = Session("username") Response.Cookies("LoginInfo")("pass") = RS("pass") Case Else Response.Cookies("LoginInfo").Expires = Now Response.Cookies("LoginInfo")("autologin") = "" Response.Cookies("LoginInfo")("username") = "" Response.Cookies("LoginInfo")("pass") = "" End Select
End If
Nej, jeg er ikke helt med. Jeg kan sagtens se proncippet i det, og ved hvordan det teoretisk skal hænge sammen. Men at omsætte det i reel kode, den kniber sq noget.
Jeg ved jeg er tung at danse med, men jeg vil gerne kunne lave denne mulighed med 2 logins med tilhørende cookies :o(
10/06-2004 23:38:18: Ok. Nej, man skal ikke kunne logge ind begge steder på samme brugernavn. Grunden til det er, at der skal foregå ét det ene sted, noget andet det andet sted. Og så skal man have muligheden for at kunne være anonym forstået på den måde, at er man aktiv det ene sted, skal man ikke kunne sættes i forbindelse med andre aktiviteter det andet sted.
Jeg ved ikke om det er nødvendigt at sammenligne profilnavne fra begge databaser. Der er vel ikke noget i vejen for, at der er en steen_hansen begge steder, hvis folk på forhånd ved, at det nødvendigvis ikke er den samme?
syntax: Response.Cookie("navnet på cookien")("specielt identifikationsnøgle") = "værdi"
"navnet på cookien" skal du bruge, i samme område indenfor IF-blokken. Dvs, blokken med .Cookies("LoginInfo_root"), skal der være .Cookies("LoginInfo_root") hele vejen ned.. og i den anden blok, skal der være .Cookies("LoginInfo_nytwebsted")
Jeg tror ikke at det er tilladt, at bruge "/" i navnet på cookien.. brug derfor ovennævnte eksempel.
Jeg har føjet det nederste ind i If-blokkene. Vil du have den nye, eller kan det ovenstående bruges? Der er efterhånden postet meget i dette spørgsmål :o)
Jeg har lavet formularen om til det, den skal se ud som. Hvis du ikke orker mere, er det 10-4, så opretter jeg bare et nyt spørgsmål. Skal jeg det, eller har du nogle gode idéer?
Det vil jeg gøre senere :o) Jeg skal ned at se Enemy of the state. Snakkes :o)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.