21. august 2004 - 18:00Der er
16 kommentarer og 1 løsning
authentication / authorization problem med login
Hej Eksperter!
Jeg har lavet en login.aspx side som gør det muligt for en bruger at logge sig ind og blive dirigeret videre til en anden .aspx-site.
Men selvom at brugeren logger ind med korrekt password og navn så bliver login.aspx-siden ved med at "loade". Meningen er at siden skal redirecte til en anden side. Det er som om at brugeren ikke har rettigheder selvom at jeg har defineret følgende i Web.config:
Hvorfor henvises der hele tiden til Login.aspx selvom at jeg i koden beder om at dirigere videre til en anden side?
Hvis jeg ændre: <authentication mode="Forms"> til <authentication mode="Windows"> er der ikke noget problem, bortset fra at jeg naturligvis kan gå til andre sider uden at være logget ind!
I dette særtema om aspekter af AI ser vi på skiftet fra sprogmodeller til AI-agenter, og hvordan virksomheder kan navigere i spændet mellem teknologisk hastighed og behovet for menneskelig kontrol.
altså.... det kontrolleres om brugen er ok mht. brugernavn og adgangskode (indtastet i tekstbokse på siden), og det meddeles bruger (her vha. en label), at oplysningerne ikke er ok.
Hej snepnet! Ja godt spørgsmål egentlig. Jeg benytter en customValidator i forbindelse med login-formen.
Men nu er jeg lidt forvirret i forbindelse med den knap, jeg har på siden! Knappen virker fint, men jeg har ikke programmeret noget i dens "event-metode endnu???" Hvis jeg tilføjer endnu en tilfældig knap så virker denne også til login, uden at jeg programmere noget i den?? Hvorfor nu det??
Det virker selvfølgelig kun hvis jeg i Web.Config ændre authentication til Windows, hvilket jo ikke er korrekt. Denne skal jo sættes til "Forms".
Her er min forløbige kode. Mest relevant er vel nok invalidPasswordValidator_ServerValidate-metoden:
using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Web.Security;
while (dataReader.Read() ) nameList.Items.Add(dataReader.GetString(0) );
oleDbConnection1.Close(); } }
#region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); }
/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.oleDbConnection1 = new System.Data.OleDb.OleDbConnection(); this.oleDbDataAdapter1 = new System.Data.OleDb.OleDbDataAdapter(); this.oleDbDeleteCommand1 = new System.Data.OleDb.OleDbCommand(); this.oleDbInsertCommand1 = new System.Data.OleDb.OleDbCommand(); this.oleDbSelectCommand1 = new System.Data.OleDb.OleDbCommand(); this.oleDbUpdateCommand1 = new System.Data.OleDb.OleDbCommand(); this.invalidPasswordValidator.ServerValidate += new System.Web.UI.WebControls.ServerValidateEventHandler(this.invalidPasswordValidator_ServerValidate); // // oleDbConnection1 // this.oleDbConnection1.ConnectionString = @"Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Registry Path=;Jet OLEDB:Database Locking Mode=1;Data Source=""C:\Inetpub\wwwroot\LoginTest\login.mdb"";Mode=Share Deny None;Jet OLEDB:Engine Type=5;Provider=""Microsoft.Jet.OLEDB.4.0"";Jet OLEDB:System database=;Jet OLEDB:SFP=False;persist security info=False;Extended Properties=;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Create System Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;User ID=Admin;Jet OLEDB:Global Bulk Transactions=1"; // // oleDbDataAdapter1 // this.oleDbDataAdapter1.DeleteCommand = this.oleDbDeleteCommand1; this.oleDbDataAdapter1.InsertCommand = this.oleDbInsertCommand1; this.oleDbDataAdapter1.SelectCommand = this.oleDbSelectCommand1; this.oleDbDataAdapter1.TableMappings.AddRange(new System.Data.Common.DataTableMapping[] { new System.Data.Common.DataTableMapping("Table", "LOGIN", new System.Data.Common.DataColumnMapping[] { new System.Data.Common.DataColumnMapping("LOGIN_BRUGERNAVN", "LOGIN_BRUGERNAVN"), new System.Data.Common.DataColumnMapping("LOGIN_ID", "LOGIN_ID")})}); this.oleDbDataAdapter1.UpdateCommand = this.oleDbUpdateCommand1; // // oleDbDeleteCommand1 // this.oleDbDeleteCommand1.CommandText = "DELETE FROM LOGIN WHERE (LOGIN_ID = ?) AND (LOGIN_BRUGERNAVN = ? OR ? IS NULL AND" + " LOGIN_BRUGERNAVN IS NULL)"; this.oleDbDeleteCommand1.Connection = this.oleDbConnection1; this.oleDbDeleteCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("Original_LOGIN_ID", System.Data.OleDb.OleDbType.Integer, 0, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "LOGIN_ID", System.Data.DataRowVersion.Original, null)); this.oleDbDeleteCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("Original_LOGIN_BRUGERNAVN", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "LOGIN_BRUGERNAVN", System.Data.DataRowVersion.Original, null)); this.oleDbDeleteCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("Original_LOGIN_BRUGERNAVN1", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "LOGIN_BRUGERNAVN", System.Data.DataRowVersion.Original, null)); // // oleDbInsertCommand1 // this.oleDbInsertCommand1.CommandText = "INSERT INTO LOGIN(LOGIN_BRUGERNAVN) VALUES (?)"; this.oleDbInsertCommand1.Connection = this.oleDbConnection1; this.oleDbInsertCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("LOGIN_BRUGERNAVN", System.Data.OleDb.OleDbType.VarWChar, 50, "LOGIN_BRUGERNAVN")); // // oleDbSelectCommand1 // this.oleDbSelectCommand1.CommandText = "SELECT LOGIN_BRUGERNAVN, LOGIN_ID FROM LOGIN"; this.oleDbSelectCommand1.Connection = this.oleDbConnection1; // // oleDbUpdateCommand1 // this.oleDbUpdateCommand1.CommandText = "UPDATE LOGIN SET LOGIN_BRUGERNAVN = ? WHERE (LOGIN_ID = ?) AND (LOGIN_BRUGERNAVN " + "= ? OR ? IS NULL AND LOGIN_BRUGERNAVN IS NULL)"; this.oleDbUpdateCommand1.Connection = this.oleDbConnection1; this.oleDbUpdateCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("LOGIN_BRUGERNAVN", System.Data.OleDb.OleDbType.VarWChar, 50, "LOGIN_BRUGERNAVN")); this.oleDbUpdateCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("Original_LOGIN_ID", System.Data.OleDb.OleDbType.Integer, 0, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "LOGIN_ID", System.Data.DataRowVersion.Original, null)); this.oleDbUpdateCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("Original_LOGIN_BRUGERNAVN", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "LOGIN_BRUGERNAVN", System.Data.DataRowVersion.Original, null)); this.oleDbUpdateCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("Original_LOGIN_BRUGERNAVN1", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "LOGIN_BRUGERNAVN", System.Data.DataRowVersion.Original, null)); this.Load += new System.EventHandler(this.Page_Load);
//En dataAdapter er en bro mellem databasen og applikationen. Her udfører jeg en SQL-kommando på adapteren. oleDbDataAdapter1.SelectCommand.CommandText = "SELECT * FROM login WHERE LOGIN_BRUGERNAVN = '" + Request.Form["nameList"].ToString() + "'";
hmmm...jeg kan ikke se hvad det er du tester for i din betingelse?? Kan du forklare mig det? Jeg benytter en cookie som kun knyttes til den enkelte session. Er din måde bedre??? Hvorfor gør du det sådan??
Jeg laver bare ikke noget selv, men lader frameworket klaret ;o) - det kode jeg har lagt er sådan et helt standardeksempel på at bruge formsauthentication, hvor du opretter brugerene i din konfigurationsfil, men du bruger jo en database, så du skal have lidt ekstra på. (så det var nok i virkeligheden ikke ret relevant at jeg postede linierne igen... sorry).
okay...jeg har kikket dit link igennem. Ganske interessant! Eneste forskel er at de benytter en MS SQL-database (eller hvad den nu hedder) Lidt anderledes når man benytter MS Access.
Ovenstående kode har jeg fra en bog...derfor "burde" det virke....Du har ikke et bud på hvorfor det ikke virker, ud fra mit eksempel???
Opsummering:
Login virker fint i det øjeblik at jeg i Web.Config ændre: <authentication mode="Forms"> til <authentication mode="Windows"> Her dirigeres brugeren videre til den rigtige side. Problemet er bare at der i denne løsning ikke er nogen sikkerhed og ide med min loginform. Nu kan alle jo få adgang til filerne!
Forfor bliver browser'en ved med at vise mig login-websiden i det øjeblik at <authentication mode="Forms"> og brugeren taster korrekt brugernavn og password????
hej fanatic - jeg skal nok kigge på det, men det bliver nok først om nogle timer (jeg har lidt småtravlt). sorry... jeg skal nok kigge det igennem så snart jeg kan. mvh
Du skal lige sørge for at din config er sat op til formsauthentication, og at din login-page er sat til din login-side.
Det fungerer så på den måde, at uanset hvilken side du prøver at gå ind på, vil du blive præsenteret for login-siden, og hvis du angiver rigtig brugernavn/adgangskode, vil du bliver viderestillet til den side du prøvede at besøge.
Ovenstående kræver klart nok at din valideringsrutine virker som den skal... jeg havde nok selv lavet det på en lidt anden måde, men det kan vi jo altid tage hvis der viser sig at være problemer med det.
Jeg har tidligere vist dig hvordan min Web.Config ser ud, og som beskrevet yderligere så er mit problem, at jeg hele tiden bliver præsenteret for min login...også selvom jeg taster korrekt brugernavn og password??
Jeg tror ikke at jeg forstår: (txtUserName.Value, chkPersistCookie.Checked); Jeg bruger jo en database?? Hvorfor synes du, at jeg skal skifte det kode ud, som jeg allerede har skrevet?? I dit eksempel sætter du ikke en cookie, eller hvordan??
nej ikke direkte... men når du kalder RedirectFromLoginPage sker det automatisk.
og så kan jeg for øvrigt godt forstå at du ikke kan forstå kaldet FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, chkPersistCookie.Checked);
lidt for hurtig paste der - beklager.
når du sidder og tester på det vil det nok være rarest for dig at skrive : FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, false);
Og så tager du bare navnet som du også bruger til at validere brugeren med... altså fra din dropdownlist, så kaldet bliver :
Ja, sagen har lige ligget stille...beklager! Jeg fik travlt med en anden opgave. Du få point og så gennemgår jeg lige tråden igen når tiden er til det...tak for hjælpen!
det går jo nok :o) du siger bare til hvis der er noget. mvh
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.