Avatar billede fanatic Nybegynder
21. august 2004 - 18:00 Der 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:

<authentication mode="Forms">
    <forms name="DatabaseCookie" loginUrl="Login.aspx" protection="Encryption" />
</authentication>

<authorization>
    <deny users="?" />
</authorization>

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!
Avatar billede snepnet Nybegynder
21. august 2004 - 18:06 #1
hvad har du af kode i login.aspx ?
Avatar billede snepnet Nybegynder
21. august 2004 - 18:09 #2
hvis du f.eks. har en knap brugeren skal trykke på for at blive logget ind, skulle du gerne have noget kode i denne stil i handleren :

private void btnLogIn_Click(object sender, System.EventArgs e)
{           
    if (FormsAuthentication.Authenticate(txtUserName.Text, txtPass.Text))
        FormsAuthentication.RedirectFromLoginPage(txtUserName.Text, false);
    else
        lblMessage.Text="Invalid Credentials: Please try again";
}
Avatar billede snepnet Nybegynder
21. august 2004 - 18:10 #3
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.
Avatar billede fanatic Nybegynder
24. august 2004 - 10:05 #4
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;

namespace LoginTest
{
    /// <summary>
    /// Summary description for Login.
    /// </summary>
    public class Login : System.Web.UI.Page
    {
        protected System.Web.UI.WebControls.TextBox passwordTextBox;
        protected System.Web.UI.WebControls.Button submitButton;
        protected System.Web.UI.WebControls.Label promptLabel;
        protected System.Web.UI.WebControls.DropDownList nameList;
        protected System.Web.UI.WebControls.RequiredFieldValidator requiredPasswordValidator;
        protected System.Data.OleDb.OleDbConnection oleDbConnection1;
        protected System.Web.UI.WebControls.CustomValidator invalidPasswordValidator;
        protected System.Data.OleDb.OleDbDataAdapter oleDbDataAdapter1;
        protected System.Data.OleDb.OleDbCommand oleDbSelectCommand1;
        protected System.Data.OleDb.OleDbCommand oleDbInsertCommand1;
        protected System.Data.OleDb.OleDbCommand oleDbUpdateCommand1;
        protected System.Data.OleDb.OleDbCommand oleDbDeleteCommand1;
        protected System.Web.UI.WebControls.Label Label1;
        protected System.Data.OleDb.OleDbDataReader dataReader;

        private void Page_Load(object sender, System.EventArgs e)
        {
            if (!IsPostBack)
            {
                oleDbConnection1.Open();

                dataReader = oleDbDataAdapter1.SelectCommand.ExecuteReader();

                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);

        }
        #endregion

        private void invalidPasswordValidator_ServerValidate(object source, System.Web.UI.WebControls.ServerValidateEventArgs args)
        {
            oleDbConnection1.Open();

            //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() + "'";

            dataReader = oleDbDataAdapter1.SelectCommand.ExecuteReader();

            dataReader.Read();

            if (args.Value == dataReader.GetString(2) )
            {
                FormsAuthentication.SetAuthCookie( Request.Form["nameList"], false);
                Session.Add("name", Request.Form["nameList"].ToString() );
                Response.Redirect("ProduktKatalog.aspx");
            }
            else
                args.IsValid = false;

            oleDbConnection1.Close();
        }
    }
}

Hvad gør jeg mon galt??
Avatar billede snepnet Nybegynder
24. august 2004 - 11:06 #5
Hvis du bruger formsauthentication skulle dette være tilstrækkeligt :

    if (FormsAuthentication.Authenticate(txtUserName.Text, txtPass.Text))
        FormsAuthentication.RedirectFromLoginPage(txtUserName.Text, false);
Avatar billede fanatic Nybegynder
24. august 2004 - 11:32 #6
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??
Avatar billede snepnet Nybegynder
24. august 2004 - 12:02 #7
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).

Denne her synes jeg lige du skal kigge igennem.
http://support.microsoft.com/?kbid=301240

Mvh
Avatar billede fanatic Nybegynder
24. august 2004 - 15:01 #8
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????
Avatar billede fanatic Nybegynder
24. august 2004 - 15:04 #9
....i address-feltet i browseren skriver den blot:
http://localhost/LoginTest/Login.aspx?ReturnUrl=%2fLoginTest%2fProduktKatalog.aspx

når jeg taster korrekt brugernavn og password...jeg videredirigeres ikke til: ProduktKatalog.aspx
Avatar billede snepnet Nybegynder
24. august 2004 - 15:13 #10
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
Avatar billede fanatic Nybegynder
24. august 2004 - 15:37 #11
jaja...jeg har god tid!!! Tag du bare al den tid du skal bruge hehe....TAK TAK ;)

Men jeg tror virkelig at der er tale om en lille-bitte ting som jeg stirre mig blind på!
Avatar billede snepnet Nybegynder
24. august 2004 - 18:06 #12
Hej fanatic :o) - så er jeg på banen igen.

Denne kode :

FormsAuthentication.SetAuthCookie( Request.Form["nameList"], false);
Session.Add("name", Request.Form["nameList"].ToString() );
Response.Redirect("ProduktKatalog.aspx");

synes jeg du skal prøve at skifte ud med :

FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, chkPersistCookie.Checked);

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.

mvh
Avatar billede fanatic Nybegynder
24. august 2004 - 18:26 #13
Hej Snepnet... ;)

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??
Avatar billede snepnet Nybegynder
24. august 2004 - 18:32 #14
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 :

FormsAuthentication.RedirectFromLoginPage(nameList.SelectedItem.Text, false);

Prøv det... hvis det ikke dutter - tror jeg der er noget i vejen med din valideringsrutine, og så kan vi jo kigge lidt på den :o)
Avatar billede snepnet Nybegynder
30. august 2004 - 00:08 #15
hvordan går det her fanatic.... jeg smider et svar her, hvis du skulle have fået noget ud af det jeg skrev.
mvh
Avatar billede fanatic Nybegynder
25. september 2004 - 19:53 #16
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!
Avatar billede snepnet Nybegynder
25. september 2004 - 20:00 #17
det går jo nok :o)
du siger bare til hvis der er noget.
mvh
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester