2013-07-12 2 views
0

Я новичок, когда дело доходит до работы с контролем входа vb.net так терпите меня ...vb.net управления Войти повторно не аутентичности

Tp начать Я использую ASP.net 4.0 и VB. сеть.

Итак, у меня есть простой элемент управления, который проверяет пользователя на базе базы данных sql. (Я хостинг с hostgator, поэтому я не могу использовать обычные окна auth). Теперь самый большой вопрос, который у меня возникает, заключается в том, что если сеанс истекает, и вы перенаправляетесь на страницу входа в систему, неважно, что вы вводите имя пользователя/пароль в форме входа в систему, это просто позволяет вам прямо, даже если имя пользователя и пароль неверны или пользователь не существует?

Как я могу убедиться, что элемент управления login действительно аутентифицирует пользователя?

Любая помощь очень ценится. Спасибо!

Public strLoginErrorMsg As String 
Public type As String 
Public rowcount As String 

Protected Sub login_sbts_Authenticate(sender As Object, e As  System.Web.UI.WebControls.AuthenticateEventArgs) Handles login_sbts.Authenticate 
    Dim bauthenticated As Boolean = False 
    bauthenticated = isValidUser(login_sbts.UserName, login_sbts.Password) 

    If bauthenticated Then 

     e.Authenticated = True 
    Else 
     e.Authenticated = False 
    End If 
    lblInfo.Text = type 
    FormsAuthentication.RedirectFromLoginPage(Me.login_sbts.UserName, True) 

    If type = "ADMIN" Then 
     Response.Redirect("dailynote.aspx") 
    Else 
     Response.Redirect("other.aspx") 
    End If 

End Sub 

Private Function isValidUser(ByVal username As String, ByVal pwd As String) As [Boolean] 

    Dim con As New SqlConnection("Data Source=localhost;Initial Catalog=sbts-scheduling;User ID=userid;Password=password;") 
    Dim cmd As New SqlCommand("select * from tblusers where UserName='" & username & "' and Password='" & pwd & "'") 
    cmd.Connection = con 
    Dim dt As New DataTable() 
    Dim da As New SqlDataAdapter(cmd) 
    con.Open() 
    da.Fill(dt) 
    con.Close() 
    If dt.Rows.Count = 0 Then 
     strLoginErrorMsg = "Invalid User Name/Password" 
     dt.Dispose() 
     Return False 
    Else 
     type = dt.Rows(0).Item("UserType").Trim() 
     Session("usertype") = type 

    End If 
    Return True 



End Function 

Protected Sub login_sbts_LoginError(sender As Object, e As System.EventArgs) Handles login_sbts.LoginError 
    login_sbts.FailureText = strLoginErrorMsg 
End Sub 
+0

вы, вероятно, должны опубликовать соответствующие части вашего файла web.config здесь. system.web, аутентификация и авторизация –

+0

, включите ваш код на первой странице, который должен содержать ваш раздел asp: login или asp: logincontrol .., который когда-либо вы используете. –

+0

. Кстати, у вас есть уязвимость SQLInjection здесь, в которой я не обращался в моем примере кода ответа. Вам следует использовать StoreProcedures и передать эти значения в хранимую процедуру с помощью New SqlClient.Data.SqlParameters (@param, "") (в вашей коллекции SqlCommand.Parameter), при этом присваивается значение SqlCommand.CommandType = CommandType.StoredProcedure. Savy –

ответ

0

На самом деле .. проблема может щелок в вызове FormsAuthentication.RedirectFromLoginPage .. Я взял на себя смелость очистки кода немного, хотя. Я также добавил FormsAuthentication.SetAuthCookie в ваш метод проверки подлинности. Имя и продолжительность этого файла cookie будут настроены в вашем файле web.config .. или в ваших «настройках конфигурации».

Если вы не желаете наследовать, очищать и заменять ASPA по умолчанию FormAuthenticationModule .. вам придется полагаться, в частности, на настройки конфигурации web.config.

Public strLoginErrorMsg As String 
Public type As String 
Public rowcount As String 

Protected Sub login_sbts_Authenticate(sender As Object, e As  System.Web.UI.WebControls.AuthenticateEventArgs) Handles login_sbts.Authenticate 
    If isValidUser(login_sbts.UserName, login_sbts.Password) Then 
     e.Authenticated = True 
     FormsAuthentication.SetAuthCookie(login_sbts.UserName, false, "/")  
     lblInfo.Text = type 

     If type = "ADMIN" Then 
      Response.Redirect("dailynote.aspx") 
     Else 
      FormsAuthentication.RedirectFromLoginPage(Me.login_sbts.UserName, True) 
      'Response.Redirect("other.aspx") 
     End If 
    Else 
     e.Authenticated = false 
    End If 
End Sub 

Private Function isValidUser(ByVal username As String, ByVal pwd As String) As Boolean 
    isValidUser = False 
    Dim conn As New SqlConnection("Data Source=localhost;Initial Catalog=sbts-scheduling;User ID=userid;Password=password;") 
    Dim cmd As New SqlCommand("select * from tblusers where UserName='" & username & "' and Password='" & pwd & "'", conn) 
    Using conn 
     conn.open 
     Using reader As system.data.sqlclient.SqlDataReader = comm.ExecuteReader 
      If reader.Count > 0 Then 
       'Not Checking for multible records here. 
       While reader.read 
        If Not(IsDBNull(reader("UserType")) Then 
         Session("usertype") = reader("UserType").Trim() 
         IsValidUser = True 
        End If 
       End While 
      End If 
     End Using 
     If Not(conn.State = State.Close) Then 
      conn.Close 
     End If 
    End Using 
End Function 

Protected Sub login_sbts_LoginError(sender As Object, e As System.EventArgs) Handles login_sbts.LoginError 
    login_sbts.FailureText = strLoginErrorMsg 
End Sub 

Я рекомендую вам ознакомиться с наследованием MembershipProvider. Это упрощает работу с тегами сервера asp, поскольку вы просто указываете своего провайдера в свойстве тега. (после того, как вы ссылаетесь и настраиваете его правильно в своем web.config, app.config .. или через IIS (требуется, чтобы его помещали в сборку глобального кэша и все остальные циклы, чтобы стать доверенным провайдером.)

+0

c onn.state - это перечисление .. и может быть «ConnectionState.Close» или что-то еще .. займет второе место для поиска .. но .. эх .. –

Смежные вопросы