Я создаю двойную форму входа, которая аутентифицирует пользователя на основе их роли и перенаправляет их на определенную страницу на основе их имени пользователя и пароля. Я был первоначально используя FormsAuthentication.RedirectFromLoginPage
для обработки переназначение, но я обнаружил, что я могу перенаправить только на одну страницу после успешного входа в систему с использованием аутентификации наОбъект нельзя передать из DBNull другим типам, если пароль или имя пользователя не найдены
<forms defaultUrl="~/InteriorStudentPortal.aspx" loginUrl="~/ExteriorLogin.aspx" slidingExpiration="true" timeout="2880"></forms>
в моем web.config. Вместо этого я использую простое свойство Response.Redirect("~/InteriorStudentPortal.aspx")
в обратном коде страницы входа. Теперь, когда пользователь вводит неправильное имя пользователя или пароль, я получаю ошибку Object cannot be cast from DBNull to other types
, которая обычно обрабатывается FormsAuthentication
. Что я могу добавить к моему обратному коду или хранимой процедуре для обработки этого исключения?
Вот один из моих сохраненных проков:
CREATE PROCEDURE [dbo].[Validate_Student]
@Username NVARCHAR(50),
@Password NVARCHAR(50)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @StudentID INT, @LastLoginDate DATETIME
SELECT @StudentID = StudentID, @LastLoginDate = LastLoginDate
FROM Student WHERE [Username] = @Username AND [Password] = @Password
IF @Username IS NOT NULL
BEGIN
UPDATE Student
SET LastLoginDate = GETDATE()
WHERE StudentID = @StudentID
SELECT @StudentID [StudentID] -- User Valid
END
BEGIN
SELECT -1 -- User invalid.
END
END
Наряду с задним кодом:
Protected Sub ValidateStudent(sender As Object, e As AuthenticateEventArgs) Handles Login1.Authenticate
Dim studentId As Integer = 0
Dim constr As String = ConfigurationManager.ConnectionStrings("DatabaseConnectionString").ConnectionString
Using con As New SqlConnection(constr)
Using cmd As New SqlCommand("Validate_Student")
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("@Username", Login1.UserName)
cmd.Parameters.AddWithValue("@Password", Login1.Password)
cmd.Connection = con
con.Open()
studentId = Convert.ToInt32(cmd.ExecuteScalar())
con.Close()
End Using
Select Case studentId
Case -1
Login1.FailureText = "Username and/or password is incorrect."
Exit Select
Case Else
Response.Redirect("~/InteriorStudentPortal.aspx")
Exit Select
End Select
End Using
End Sub
Ошибка возникает на studentId = Convert.ToInt32(cmd.ExecuteScalar())
линии. Любая помощь была бы весьма признательна, и я был бы рад предоставить любую дополнительную информацию.
Спасибо за быстрый ответ. Это сделал трюк! – NOSDUH
@NOSDUH Да, на самом деле, это ужасный ответ: [VB.NET - Слепой, ведущий слепой - IIf] (https://dotnetfiddle.net/bJxrFe) –
@NOSDUH ответ обновлен, В случае, если вы поймали любое исключение –