Avatar billede ha9953 Nybegynder
24. september 2003 - 23:23 Der er 17 kommentarer og
1 løsning

authentication mode="Forms"

Jeg er ved at lave et site hvor der bl.a. skal laves en admin-del og en kunde-del, hvor der begge steder kræves logon.

Mit problem opstår når jeg skal have 2 forskellige loginsider til 2 forskellige mapper/områder.

Jeg har fået det til at fungrer ved en loginside og en mappe på følgende måde:

webconfig i roden:

<configuration>
    <system.web>
        <compilation debug="true" />
        <pages validateRequest="false" />       
        <customErrors mode="Off"/>
        <authentication mode="Forms">
            <forms name=".ASPX" loginUrl="admin/login.aspx" protection="All" timeout="60" />
        </authentication>           
    </system.web>
</configuration>

Web.config i mappen:

<configuration>
  <system.web>
    <authorization>
        <deny users="?" />
    </authorization>
  </system.web>
</configuration>

Men hvad gør jeg når jeg vil haev 2 foeskellige loginsider til henholdshvis admin og kundeområde?

Håber det er til at forstå ;-)
Avatar billede tommer Nybegynder
24. september 2003 - 23:26 #1
du kan lave 2 projecter (med hver sin webconfig fil og så sætte en reference mellem projecterne..
Avatar billede ha9953 Nybegynder
24. september 2003 - 23:28 #2
Hvordan det ?
Avatar billede odegaard Nybegynder
24. september 2003 - 23:30 #3
...også kaldet to forskellige applikationer. Dvs. din admin-mappe skal oprettes som en seperat applikation, hvilket gøres fra IIS'en.
Man kan desværre ikke bare lave to web.config filer, da <authentification mode="Forms"> ikke lader sig override.
Avatar billede ha9953 Nybegynder
24. september 2003 - 23:33 #4
ok - det var jeg selv klar over - men jeg vil mene at der må være en nemmere måde at gøre det på via web.config
Avatar billede tommer Nybegynder
24. september 2003 - 23:33 #5
nååå ja "applikationer", sorry odegaard ;-)
Avatar billede tommer Nybegynder
24. september 2003 - 23:36 #6
nope, det kan man ikke, fordi som odegaard rigtigt siger <authentification mode="Forms"> jo kun kan gælde for én form..
Avatar billede odegaard Nybegynder
24. september 2003 - 23:55 #7
Kan du ikke bare se på Request.QueryString["ReturnUrl"], og så afgøre om det er den ene eller anden login-form du vil vise?
Hvis du designer således at alle brugere så og sige er ens, men med forskellige levels af rettigheder (fx. Admin / ikke-admin) så præsenteres de blot for forskellige muligheder efter login.
Avatar billede Slettet bruger
26. september 2003 - 11:07 #8
Det ville være nemmere at implimentere en rolle baseret sikkerhed og angive at kun dem med rollen "admin" har adgang til den mappe osv. Derved kan du stadig angive indstillingerne i web.config og kun 1 projekt.
<location path="admin">
    <system.web>
        <authorization>
              <allow roles="admin" />             
              <deny users="*" />
        </authorization>
    </system.web>
</location>
</configuration>
Avatar billede odegaard Nybegynder
26. september 2003 - 18:32 #9
zitchbow: Du er gud! Den indstilling har jeg søgt længe efter (<locaton>)
Avatar billede ha9953 Nybegynder
01. oktober 2003 - 23:00 #10
Jeg har nu kigget på ovenstående - og implementeret følgende:

Webconfig:

    <location path="kundeinfo/sikkerhed">
        <system.web>
            <authorization>
              <allow roles="kunde" />             
              <deny users="*" />
            </authorization>
        </system.web>
    </location>   

Login:

    Sub Login_Click(Src As Object, E As EventArgs)
            OpenDB("admin")
                dim ssql as string
                dim ObjCmd As OledbCommand               
                dim ObjRs As OledbDataReader               
                sSQL = "SELECT * FROM adminoversigt WHERE admin_mail='" & txtbruger.Text & "';"
                objCmd = new OledbCommand(sSql,ObjConn)
                objRs = objCmd.ExecuteREader()
           
                If objRs.Read()
                    If ObjRs("admin_password").ToString = txtpassword.text Then                       
                        Dim roleList As New ArrayList
                        roleList.Add("kunde")

                       
                        Dim roleListArray As String() = roleList.ToArray(GetType(String))
                   
                        HttpContext.Current.User = New GenericPrincipal(User.Identity, roleListArray)                       
                        FormsAuthentication.RedirectFromLoginPage(txtbruger.Text, false)
                    Else
                        labbesked.text = "Password er forkert"
                    End If
                Else
                    labbesked.text = "Bruger er forkert"
                End If       
            CloseDB("admin")
    end sub

Men når jeg klikker på login ser det ud som om den går tilbage til den side jeg vil have vist hvorefter at hoppe tilbage til login igen?

Er der nogen der kan se hvad problemet er?
Avatar billede Slettet bruger
02. oktober 2003 - 00:19 #11
Du tilføjer rollerne ved login, men når den loader siden er det glemt igen. Du skal blot sætte din HttpContext.Current.User = New GenericPrincipal(User.Identity, roleListArray) under begin_authorization i global.asax, husk lige at tjekke at bruger har logget ind inden du giver ham adgang til rollerne.

Hvorfor afviser du mit svar når du alligevel bruger min ide ?
Avatar billede ha9953 Nybegynder
02. oktober 2003 - 10:47 #12
Til zitchbow:

Har du et lille eksemple liggende på ovenstående - jeg kan ikke rigtigt få det til at virke?

Hvis du svarer på denne får du de 100 og ekstra hundred hvis du har et eksempel liggende :-)
Avatar billede Slettet bruger
02. oktober 2003 - 20:31 #13
Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)

If Request.IsAuthenticated = True Then
Dim roles(1) As String

roles(0) = "admin"
roles(1) = "owner"

Context.User = New GenericPrincipal(Context.User.Identity, roles)

End If
End Sub

Regner med du selv kan hente den liste af roller brugeren har.
Avatar billede ha9953 Nybegynder
02. oktober 2003 - 23:30 #14
jeg har nu stort set fået min login funktion til at virke - dog kommer der følgende fejl når jeg klikker på login:

Exception Details: System.InvalidOperationException: ExecuteReader requires an open and available Connection. The connection's current state is Closed.

Source Error:


Line 28:                 sSQL = "SELECT * FROM adminoversigt WHERE admin_mail='" & txtbruger.Text & "';"
Line 29:                 objCmd = new OledbCommand(sSql,ObjConn)
Line 30:                 objRs = objCmd.ExecuteREader()
Line 31:            
Line 32:                 If objRs.Read()

Min login ser ud som følgende:

    Sub Login_Click(Src As Object, E As EventArgs)
            OpenDB("admin")
                dim ssql as string
                dim ObjCmd As OledbCommand               
                dim ObjRs As OledbDataReader               
                sSQL = "SELECT * FROM adminoversigt WHERE admin_mail='" & txtbruger.Text & "';"
                objCmd = new OledbCommand(sSql,ObjConn)
                objRs = objCmd.ExecuteREader()
           
                If objRs.Read()
                    If ObjRs("admin_password").ToString = txtpassword.text Then                                   
                        FormsAuthentication.RedirectFromLoginPage(txtbruger.Text, false)
                    Else
                        labbesked.text = "Password er forkert"
                    End If
                Else
                    labbesked.text = "Bruger er forkert"
                End If       
            CloseDB("admin")
    end sub

og min global.asax ser ud som følgende:

    Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
        If Request.IsAuthenticated = True Then

            Dim strConnGlobal as string
            Dim strSQLGlobal as string
            Dim objConnGlobal as OledbConnection
            Dim DBstiGlobal as string   
            Dim ObjRsGlobal as OledbDataReader
            Dim ObjCmdGlobal As OledbCommand
   
            DBstiGlobal = ConfigurationSettings.AppSettings("databasesti") & "admin.mdb"
            strConnGlobal = "Provider=Microsoft.Jet.OLEDB.4.0;"
            strConnGlobal += "Data Source=" & DBstiGlobal
            objConnGlobal = new OledbConnection(strConnGlobal)
            objConnGlobal.Open()
           
            strSQLGlobal = "SELECT adminoversigt.*, roller.rolle, adminoversigt.admin_mail FROM adminoversigt INNER JOIN roller ON adminoversigt.admin_id = roller.admin_id WHERE (((adminoversigt.admin_mail)='" & User.Identity.Name & "'));"
           
            ObjCmdGlobal = new OledbCommand(strSQLGlobal,objConnGlobal)
            ObjRsGlobal = ObjCmdGlobal.ExecuteREader()
       
            Dim roleList As New ArrayList
            Do While ObjRsGlobal.read()
                roleList.Add(ObjRsGlobal("rolle"))
            Loop
   
            Dim roleListArray As String() = roleList.ToArray(GetType(String))

            objConnGlobal.Close
            objConnGlobal = Nothing           
       
            Context.User = New GenericPrincipal(Context.User.Identity, roleListArray)   
        End If
    End Sub

Er der nogen der kan finde fejlen?
Avatar billede ha9953 Nybegynder
02. oktober 2003 - 23:31 #15
Jeg giver 50 point til den der finder løsningen
Avatar billede ha9953 Nybegynder
02. oktober 2003 - 23:32 #16
det virker fint nok når jeg tester det af lokalt - det er kun når jeg smider det op på mit webhotel at fejlen kommer?
Avatar billede tommer Nybegynder
03. oktober 2003 - 00:20 #17
er din con åben ??
Avatar billede ha9953 Nybegynder
03. oktober 2003 - 00:25 #18
Har fundet fejlen - stien til databsen var forkert!!

Spørgsmålet er hermed lukket
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