用数据库进行ASP.NET登录验证

时间:2012-07-27 22:16:42

标签: asp.net database login sqldatasource

我已登录我的asp页面请求名称/传递和按钮。

我在我的数据库和SqlDataSource创建了一个连接字符串,并在SqlDataSource中提供了查询:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
     ConnectionString="<%$ ConnectionStrings:CarRentalConnectionString %>" 
     SelectCommand="SELECT * FROM [Customers] WHERE (([UserName] = @UserName) AND ([PassWord] = @PassWord))">
     <SelectParameters>
        <asp:ControlParameter ControlID="uname" Name="UserName" PropertyName="Text" Type="String" />
        <asp:ControlParameter ControlID="pass" Name="PassWord" PropertyName="Text" Type="String" />
    </SelectParameters>
</asp:SqlDataSource>

我的问题是我不知道如何激活/执行它以及如何获取查询返回的数据?

我有一种感觉,这是错误的方式(希望是错的)

希望你们中的一位能给我一个提示或指出我正确的方向:)

提前致谢

1 个答案:

答案 0 :(得分:1)

使用SqlDataSource是不合适的,因为您不是简单地以明确的方式检索数据。您需要在程序上定义用户验证(而非验证)逻辑。

通常的方法如下。请注意,您应该对密码进行哈希处理,而不是将其存储在纯文本中。为简洁起见,省略了哈希盐渍。

public static Boolean Authenticate(String userName, String password) {

    using(SqlConnection c = new SqlConnection("myConnectionString")
    using(SqlCommand cmd = c.CreateCommand()) {
        c.Open();
        cmd.CommandText = "SELECT UserName, PasswordHash, OtherDataEtc FROM Users WHERE UserName = @userName";

        cmd.Parameters.Add("@userName", SqlDbType.Varchar, 50).Value = userEnteredUserName;

        using(SqlDataReader rdr = cmd.ExecuteReader()) {
            if( !rdr.Read() ) return false; // no matching user found

            Byte[] passwordHash = rdr.GetBytes( 1 );
            Byte[] hash = Hash( userEnteredPassword ); // Use at least SHA1
            return Array.Equals( passwordHash, hash );
        }
    }
}

// Usage in ASP.NET:

public override OnPageLoad(Object sender, EventArgs e) {
    if( IsPostBack ) {
        Validate();
        if( IsValid ) {
            Boolean auth = Authenticate( this.userName, this.password ); // member textbox controls
            if( auth ) {
                FormsAuthentication.SetAuthCookie( this.userName, true );
                FormsAuthentication.RedirectFromLoginPage("somewhere", true);
            } else {
                Response.Redirect("loginFailedPage");
            }
        }
    }
}