Пользовательский вход ASP.NET C # - PullRequest
9 голосов
/ 28 апреля 2011

В настоящее время я делаю пользовательский вход в 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?В настоящее время я пытаюсь понять, Это .

Любая помощь будет высоко ценится;)

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

Ответы [ 4 ]

21 голосов
/ 28 апреля 2011

Хорошо, я скажу это, но знайте, что я имею в виду это наилучшим образом ...

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

Я не спорю с использованием пользовательской базы данных, хотя в Asp.Net это уже встроено. Я даже не спорю с ручным кодированием этого метода, когда вы могли бы использовать Очень хорошая подключаемая модель провайдера , встроенная в Asp.Net. Я спорю против того, насколько широко этот код открыт для атаки Sql Injection.

Подумайте на секунду, что произойдет, если я введу x'; DROP TABLE Users; -- в качестве имени пользователя? ПЛОХОЙ ЧЕЛОВЕК !!!!

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

6 голосов
/ 28 апреля 2011

В коде, который вы разместили, не так много вещей.

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

НИКОГДА никогда не делайте конкатенацию строк для построения запроса. Это оставляет ваше приложение открытым для SQL-инъекций. Вместо этого используйте параметризованный запрос.

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

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

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

Если вы ДЕЙСТВИТЕЛЬНО хотите создать собственную простую систему аутентификации, используйте что-то вроде http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html вручную назначить роли пользователя идентификатору пользователя.

2 голосов
/ 28 апреля 2011

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

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

2 голосов
/ 28 апреля 2011

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

После того, как все настроено, вы можете проверять права пользователя через свойство Page.User в файле кодовой страницы aspx.

...