ASP.NET 2.0 Login control + MySQL, VS2008, авторизация пользователей на сайте

в 15:35, , рубрики: ASP, mysql, авторизация на сайт, метки: ,

Штатные средства ASP.NET позволяют упростить процесс разграничения прав доступа пользователей к тем или иным страницам сайта. Речь о использовании Login control совместно с MySQL базой данных для авторизации пользователей на ASP.NET сайте. После успешной авторизации будет производиться перенаправление на разные страницы, соответствующие заданным ролям некоторых директорий проекта.

ASP.NET 2.0 Login control + MySQL, VS2008, авторизация пользователей на сайте

Штатные контролы вкладки Login панели инструментов позволяют реализовать всё, что связано с авторизацией пользователей. Данные о пользователях хранятся в базе данных, в частности в MySQL. Причём нужные таблицы базы данных будут созданы автоматически. Контролы самостоятельно взаимодействуют с базой данных, т.е. в частных случаях не придётся писать дополнительный код.

Элементы управления входом ASP.NET работают используя обычный текст через HTTP. Для обеспечения безопасности можно использовать HTTPS с шифрованием протокола SSL.

Описание задачи можно пропустить, тут оно для красного словца.
Текущая задача заключается в разграничении прав доступа для четырёх категорий пользователей. 0* 1* 2* 3*. 0* я категория наивысшая, позволяет создавать любые подчинённые категории. Такая же схема предусмотрена и для остальных категорий. Для каждой категории предусмотрен свой набор страниц. Добавить пользователя может только уже существующий пользователь, обладающий соответствующими правами. Т.е. самостоятельной регистрации пользователей не будет. Страница с высшим приоритетом будет включать все подчинённые, иметь возможность просмотреть, изменить все настройки подчинённых страниц.
Пользователи категории 3* будут иметь возможность только просматривать данные, с минимальным набором функционала. Пользователи категории 2* будут иметь все возможности 3*й категории + специализированные настройки, содержать дерево/список пользователей 3*й категории, возможность создавать, удалять пользователей 3*й категории. Пользователи 2*й и 0*й категории также будут включать все подчинённые категории и иметь возможность менять любые настройки подчинённых пользователей.

Всё это пока фантазии. В статье будет рассмотрена реализация авторизации для четырёх папок, каждая из которых будет содержать свою .aspx страницу.

Полагаем, что проект web приложения или web сайта уже создан. VS2008 framework 3.5. Создана страница Login.aspx и на неё помещён контрол login.

Visual Studio 2012 поддерживается версиями MySQL Connector/Net 6.6 и выше
Visual Studio 2010 поддерживается версиями MySQL Connector/Net 6.3.2 и выше, приложения использующие ранние версии Connector могут использоваться с Visual Studio 2010 через .NET 2.x framework.
Visual Studio 2008 поддерживается только MySQL Connector/Net 6.4.

С официального сайта MySQL качаем библиотеки Connector/Net 6.4.6 для .NET & MONO mysql-connector-net-6.4.6-noinstall.zip и для windows mysql-connector-net-6.4.6.msi.

Устанавливаем mysql-connector-net-6.4.6.msi, это в том числе настроит конфигурацию файлов:

C:WindowsMicrosoft.NETFrameworkv4.0.30319Configmachine.config
C:WindowsMicrosoft.NETFrameworkv2.0.50727CONFIGmachine.config

Это важный момент, т.к. по началу, по рекомендации с некоторой статьи, начал редактировать machine.config v2 вручную, не устанавливая .msi. Иконки MySQL Website Configuration Tool пока не будет, появиться при последующих настройках.

Если для VS2008 установить не ту версию mysql-connector, то можно наблюдать следующую ошибку, при запуске ASP.NET Configuration -> Security/Безопасность -> Пошаговый мастер настройки безопасности

Произошла ошибка. Вернитесь на предыдущую страницу и повторите попытку. 

Следующее сообщение может помочь при диагностике проблемы: Невозможно загрузить файл или сборку "MySql.Web, Version=6.7.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" или один из зависимых от них компонентов. Не удается найти указанный файл. в System.RuntimeTypeHandle._GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark, Boolean loadTypeFromPartialName) в System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) в System.RuntimeType.PrivateGetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) в System.Type.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) в System.Web.Compilation.BuildManager.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase) в System.Web.Configuration.ConfigUtil.GetType(String typeName, String propertyName, ConfigurationElement configElement, XmlNode node, Boolean checkAptcaBit, Boolean ignoreCase)

Копируем следующиве .dll из v2(mysql-connector-net-6.4.6-noinstall.zip) директории архива в bin директорию проекта web приложения:
V2mysql.data.dll
V2mysql.web.dll

Добавляем references на MySql.Data и MySql.Web.

В web.config добавляем:

<!--  
  <connectionStrings/>
-->
<connectionStrings>
  <remove name="LocalMySqlServer"/>
  <add name="LocalMySqlServer" connectionString="Server=sta.tic.ip4.adr; Database=MySQLBaseName; uid=user; pwd=password;" providerName="MySql.Data.MySqlClient"/>
</connectionStrings>

Проект разрабатываем под виндой, работать он будет под FreeBSD+apache2+mono. Чтобы всё было “по настоящему”, на реальном FreeBSD сервере с внешним статическим IP создаём MySql55 базу данных и пользователя с паролем. Соответственно настройка файервола и проброс портов при необходимости. Таблицы будут созданы позже и автоматически. Конечно, MySQL базу данных открываем для всего интернета только на время и для отладки.
Создаём базу данных и пользователя:

# mysql -u root -p
Enter password:
mysql> create database MySQLBaseName;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE USER 'user'@'sta.tic.ip4.adr' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON MySQLBaseName.* TO 'user'@'sta.tic.ip4.adr' IDENTIFIED BY 'password' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit

Проверяем возможность подключения с VS2008 Vista к удалённой MySql базе данных:

На страницу Login добавляем Label ErrorL, в которую будем выводить какие-либо отладочные сообщения текущей страницы. Если возникают какие либо проблемы с подключением к базе данных, то процедура попытки подключения займёт секунд 10 и потом вывод ошибки.

Теперь в Login.aspx.cs в Page_Load добавляем:

using MySql.Data;
using MySql.Data.MySqlClient;

protected void Page_Load(object sender, EventArgs e)
{
    //Проверяем соединение с удалённой MySql
    string CommandText = "";
    string Connect = "Database=MySQLBaseName;Data Source=sta.tic.ip4.adr;User Id=user;Password=password";
    MySqlConnection myConnection = new MySqlConnection(Connect);
    MySqlCommand myCommand = new MySqlCommand(CommandText, myConnection);
    try
    {
        myConnection.Open();
        string dd = myConnection.Database;
        string dd1 = myConnection.DataSource;
        string dd2 = myConnection.ServerVersion;
        ConnectionState cs = myConnection.State;

        myConnection.Close();
    }
    catch (MySqlException ex)
    {
        switch (ex.Number)
        {
            case 0:    ErrorL.Text = "Error 0. Cannot connect to server"; break;
            case 1045: ErrorL.Text = "Error 1045. Invalid username/password, please try again"; break;
            case 1042: ErrorL.Text = "Error 1042. Unable to connect to any of the specified MySQL hosts"; break;
        }                
    }            
}

В строку Connect подставляем свои значения.

Запускаем на пошаговый прогон с меткой в Page_Load, и в случае успешного подключения myConnection.Open(); выполниться сразу, и в нижеследующих переменных будут соответствующие значения. Считаем, что база данных и доступ к ней настроен.

В свойствах контрола Login прописываем параметр:
MembershipProvider = MySQLMembershipProvider

Чтобы появилась иконка MySQL Website Configuration Tool нужно настроить Data Connections в Server Explorer. Server Explorer -> Data Connections -> Add Connection… ->
ASP.NET 2.0 Login control + MySQL, VS2008, авторизация пользователей на сайте

ASP.NET 2.0 Login control + MySQL, VS2008, авторизация пользователей на сайте

Server name в текущем случае это статический IPv4 адрес удалённого сервера с MySQL.
Теперь, рядом с иконкой зелёного круга с молотком, должна появиться иконка MySQL Website Configuration Tool круг неоднородного светло синего цвета, с белым крестом из изображений ключа и наверно отвёртки, как на изображении ниже.
ASP.NET 2.0 Login control + MySQL, VS2008, авторизация пользователей на сайте

Через MySQL Website Configuration Tool можно задать/поменять много нужных параметров. По контексту можно разобраться, для чего нужны те или иные настройки.

Через Web Administration Tools настраиваем первых пользователей и распределяем роли и права доступа. Здесь же происходит автоматическая настройка нужных таблиц MySql базы данных. Далее, при штатном функционировании сайта, в реализуемой задаче, пользователей будут добавлять другие пользователи.

Создаём 4ре директории в каталоге проекта:
…/dir/a0
…/dir/a1
…/dir/a2
…/dir/a3
Доступ к страницам ASP.NET ограничивается путем помещения их в защищенную папку.

На вкладке ASP.NET Configuration -> поставщик, должно быть так:

ASP.NET 2.0 Login control + MySQL, VS2008, авторизация пользователей на сайте

На вкладке безопасность, используя мастер настройки безопасности, сопоставляем папку и ранее созданную роль. Для удобства, имя папки = имя роли. Затем сопоставляем созданных пользователей ранее созданным ролям. Т.е. нужно назначить папке роль и включить в роль нужных, ранее созданных пользователей.

Посмотрим на таблицы базы данных на сервере:
# mysql -u root -p
Enter password:
mysql> use MySQLBaseName;
mysql> SHOW TABLES;
+--------------------------+
| Tables_in_MySQLBaseName |
+--------------------------+
| my_aspnet_applications |
| my_aspnet_membership |
| my_aspnet_profiles |
| my_aspnet_roles |
| my_aspnet_schemaversion |
| my_aspnet_sessioncleanup |
| my_aspnet_sessions |
| my_aspnet_users |
| my_aspnet_usersinroles |
+--------------------------+
9 rows in set (0.00 sec)
mysql> quit

Т.е. на удалённом сервере таблицы для ранее созданной базы данных автоматически созданы.
То же самое можно посмотреть в Server Explorer -> Data Connection.

Т.к. нужно, чтобы для каждой роли вход происходил на свою страницу a0.aspx, a1.aspx, a2.aspx, a3.aspx. То задаём Event контролу Login, после успешного входа, переход на соответствующую страницу:

protected void Login1_LoggedIn(object sender, EventArgs e)
{
    if (Roles.IsUserInRole(Login1.UserName, "a0")) { Response.Redirect("~/dir/a0/a0.aspx"); return; }
    if (Roles.IsUserInRole(Login1.UserName, "a1")) { Response.Redirect("~/dir/a1/a1.aspx"); return; }
    if (Roles.IsUserInRole(Login1.UserName, "a2")) { Response.Redirect("~/dir/a2/a2.aspx"); return; }
    if (Roles.IsUserInRole(Login1.UserName, "a3")) { Response.Redirect("~/dir/a3/a3.aspx"); return; }
}

Запускаем проект, вводим имя пароль и наблюдаем переход на соответствующую страницу.

Автор: AlexeyNovikov

Источник

Поделиться

* - обязательные к заполнению поля