26. september 2005 - 08:25Der er
18 kommentarer og 1 løsning
Database login med roles
Jeg har lavet en login side hvor jeg bruger database og logger brugeren ind med "FormsAuthentication.RedirectFromLoginPage()". Men hvordan kan man få den bruger som er logget ind til at blive medlem af en role som jeg selv sætter? Dette skal jeg bruge da jeg har to forskellige slags brugere, en Admin og en normal Bruger.
Sådan her ser min web.config ud: <configuration> <system.web> <authentication mode="Forms"> <forms name="loginaspnet" path="/" protection="All" loginUrl="Login.aspx" timeout="2"> </forms> </authentication> </system.web>
Du vil typisk skulle tilføje noget kode til Application_AuthenticateRequest() metoden i din Global.asax.cs/vb - i denne metode henter du rollerne op fra databasen og samler en IPrincipal som du smider efter brugeren. Kildekode eksempler findes i massevis i de artikler du finder på Google :)
Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUsername.Text, false)); så den bliver til Response.Redirect(FormsAuthentication.GetRedirectUrl(txtUsername.Text, true));
det giver dig en persistant cookie istedet for en der udløber.
Ville det ikke bare være nok at sætte "chkAutologin.Checked" til den "isPersistent As Boolean" der er i denne linje? Og så sætte "Expiration As Date" til så lang tid at cookien skal gemmes?
Dim fat As FormsAuthenticationTicket = New FormsAuthenticationTicket(1, txtUsername.Text, DateTime.Now, DateTime.Now.AddMinutes(30), chkAutologin.Checked, strRole, FormsAuthentication.FormsCookiePath)
Når jeg har sat den til at skulle logge ind automatisk og så lukker ned for hele browser vinduet. Når jeg så starter det igen og skriver adressen ind så går den bare til login side som om man slet ikke er logget ind. Jeg har prøvet at skrive hele adressen til den fil den skal gå til når man er logget ind men det virker heller ikke.
<script runat="server"> Protected Sub btnLogin_Click(ByVal sender As Object, ByVal e As System.EventArgs) If ValidateUser(txtUsername.Text, txtPassword.Text) Then FormsAuthentication.Initialize() Dim strRole As String = AssignRoles(txtUsername.Text)
Dim ExpDate As New Date If chkAutologin.Checked Then ExpDate = DateTime.Now.AddDays(30) Else ExpDate = DateTime.Now.AddMinutes(30) End If
Dim fat As FormsAuthenticationTicket = New FormsAuthenticationTicket(1, _ txtUsername.Text, DateTime.Now, ExpDate, chkAutologin.Checked, strRole, _ FormsAuthentication.FormsCookiePath) Response.Cookies.Add(New HttpCookie(FormsAuthentication.FormsCookieName, _ FormsAuthentication.Encrypt(fat)))
If strRole = "Admin" Then Response.Redirect("Admin\Default.aspx") Else Response.Redirect("Bruger\Default.aspx") End If Else lblError.Visible = True End If End Sub
Private Function ValidateUser(ByVal strUsername As String, ByVal strPassword As String) As Boolean Return CBool(strUsername = "admin" Or strUsername = "bruger" AndAlso strPassword = "ko") End Function
Private Function AssignRoles(ByVal strUsername As String) As String If txtUsername.Text = "admin" Then Return "Admin" ElseIf txtUsername.Text = "bruger" Then Return "Bruger" Else Return String.Empty End If End Function
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) If Not Page.IsPostBack Then If Request.QueryString("out") = "true" Then Session.Abandon() FormsAuthentication.SignOut() Else If Not (HttpContext.Current.User Is Nothing) Then If HttpContext.Current.User.Identity.IsAuthenticated Then Dim fi As FormsIdentity = CType(HttpContext.Current.User.Identity, FormsIdentity) Dim fat As FormsAuthenticationTicket = fi.Ticket Dim astrRoles As String() = fat.UserData.Split("|")
If astrRoles(0) = "Admin" Then Response.Redirect("Admin\Default.aspx") Else Response.Redirect("Bruger\Default.aspx") End If End If End If End If End If End Sub </script>
Det skal lige siges at jeg har prøvet med den linje der men har sat den som kommentar fordi der ikke nogen forskel (så vidt jeg kan se) med den og den her
Dim fat As FormsAuthenticationTicket = New FormsAuthenticationTicket(1, _ txtUsername.Text, DateTime.Now, ExpDate, chkAutologin.Checked, strRole, _ FormsAuthentication.FormsCookiePath)
undskyld min responstid - jeg er ikke hjemme - og det bliver muligvis først imorgen sen aften (som så er tidlig morgen for dig) at jeg kan kigge nærmere på det. men kan du ikke prøve at debugge igennem det, og se hvor det knækker? mvh
Dim AuthCookie As New HttpCookie(FormsAuthentication.FormsCookieName) AuthCookie.Expires = ExpDate AuthCookie.Value = FormsAuthentication.Encrypt(fat) AuthCookie.Path = FormsAuthentication.FormsCookiePath Response.Cookies.Add(AuthCookie)
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.