Вопрос

В настоящее время я делаю пользовательский вход в ASP.NET. Я изменил код управления входом в систему, чтобы использовать мою базу данных вместо таблицы ASPNET. Вот образец моего кода;

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;


public partial class Login : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    // Custom login control
    protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
    {
        try
        {
            string uname = Login1.UserName.Trim();
            string password = Login1.Password.Trim();

            bool flag = AuthenticateUser(uname, password);
            if (flag == true)
            {
                e.Authenticated = true;
                Login1.DestinationPageUrl = "Default.aspx";
            }
            else
                e.Authenticated = false;
        }
        catch (Exception)
        {
            e.Authenticated = false;
        }
    }

    private bool AuthenticateUser(string uname, string password)
    {
        bool bflag = false;
        string connString = "Server=DEVSERVER;User ID=sa;Password=whatpassword;Database=CommonUser";
string connstring2 = "Server=DEVSERVER;User ID=sa;Password=whatpassword;Database=Admins";
        string strSQL = "Select * from dbo.Users where Username ='" + uname + "' and Password ='" + password + "'";
        DataSet userDS = new DataSet();
        SqlConnection m_conn;
        SqlDataAdapter m_dataAdapter;
        SqlCommand m_Command;
        try
        {
            m_conn = new SqlConnection(connString);
            m_conn.Open();
            m_dataAdapter = new SqlDataAdapter(strSQL, m_conn);
            m_dataAdapter.Fill(userDS);
            m_conn.Close();
        }
        catch (Exception)
        {
            userDS = null;
        }

        if (userDS != null)
        {
            if (userDS.Tables[0].Rows.Count > 0)
                bflag = true;
        }
        return bflag;

    }
}

У меня есть еще одна база данных для пользователей администратора. Поэтому мой вопрос заключается в том, как я могу проверить базу данных для пользователей администратора. Также как я могу ограничить обычных пользователей на определенных страницах, таких как ~ admin/adminpages.aspx? Я сейчас пытаюсь понять Этот.

Любая помощь приветствуется ;)

заранее спасибо

Это было полезно?

Решение

Итак, я собираюсь сказать это, но знаю, что я имею в виду это самым приятным способом ...

Ты делаешь это неправильно!

Я не спорю против использования пользовательской базы данных, хотя ASP.NET Уже есть встроенный. Я даже не спорю против кодирования рук в методе, когда вы могли бы использовать самую Хорошая модель поставщика подключения что ASP.NET встроен. То, что я спорю, так это то, насколько широко открыт этот код для Атака инъекции SQL.

Подумайте на секунду, что произойдет, если бы я напечатал x'; DROP TABLE Users; -- Как имя пользователя? Плохие вещи, чувак !!!!

Хорошо, так что серьезно перейдите по ссылкам, которые я вставлю, и, пожалуйста, пожалуйста, по крайней мере, по крайней мере Используйте параметризованные запросы!

Другие советы

Есть довольно много вещей не так с опубликованным вами кодом.

string strSQL = "Select * from dbo.Users where Username ='" + uname + "' and Password ='" + password + "'";

Никогда никогда никогда не делайте строковую конкатенацию, чтобы построить запрос. Это оставляет ваше заявление открытым для инъекции SQL. Вместо этого используйте параметризованный запрос.

Почему у вас есть отдельная база данных для администраторов и общих пользователей? Разве вы не сохраните все логики в одной таблице в одной базе данных. Затем либо используйте одно поле «Исадмин», либо используйте отдельную таблицу ролей и таблицу пользователей, чтобы определить, какие пользователи являются администратором или нет.

Какова ваша причина не использовать поставщика членов встроенного? Вы настраиваете встроенный провайдер для использования любой базы данных, а не только AppData aspnet.mdf.

Обычно вы ограничиваете разные страницы разными пользователями, используя роли, это может быть установлено в файле web.config внутри элемента авторизации.

Если вы действительно хотите создать пользовательскую простую систему аутентификации, используйте что -то вроде http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.htmlЧтобы вручную назначить пользовательские роли пользователю.

Я действительно думаю, что вы не должны вообще не должны жесткие параметры подключения базы данных вообще. Это плохая практика, потому что если БД изменится, вам придется перекомпилировать. Итак, что вы должны сделать, так это реализовать пользовательское членство и поставщика ролей. Видеть эта статья. По сути, вам нужно создать пользовательский класс, который наследует от System.Web.security.roleprovider и System.Web.security.membershipprovider. Членство управляет пользователями и ролями, хорошо .. разрешения пользователя.

После того, как все будет установлено, вы можете проверить разрешения пользователя через свойство page.user в вашем файле кода страницы ASPX.

Чтобы добавить мой голос в микс. Те, кто не учится на истории, обречены повторить это. Система членства ASP.NET является результатом многих лет людей, пытающихся реализовать свои собственные системы аутентификации пользователей. Microsoft узнала из этого. Так и вы должны.

Используйте модель поставщика членов. Если вы не хотите использовать поставщика по умолчанию, тогда реализуйте свой собственный собственный. Но, честно говоря, очень легко использовать встроенного провайдера и адаптировать его к всем, что вы хотите.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top