Что такое код asp logextfileusername


Содержание

IT Notes

четверг, 26 августа 2010 г.

Основы Asp.Net – Часть 2

Продолжим нашу серию статей про web-приложения и в этой статье поговорим о клиентских скриптах и о классическом asp.

Клиентские скрипты

Одной из больших проблем для множества web-приложений является необходи­мость вновь обращаться с повторными запросами на web-сервер для внесения из­менений в то, что показывается пользователю в окне браузера. Конечно, во многих случаях такие обращения неизбежны, но если есть возможность сократить их ко­личество, то этой возможностью надо пользоваться. Один из способов сократить количество запросов на web-сервер заключается в применении клиентских (браузерных) скриптов, например, для проверки введенных пользователем данных пе­ред передачей этих данных на сервер.

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

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

Существует множество языков для работы со скриптами, но для скриптов, выполняющихся в браузерах, подойдут далеко не все. Inretnet Explorer поддерживает два языка: VBScript (диалект Visual Ваsic для работы со скриптами) и JavaScript, а Netscape Navigator — только JavaScript. Если мы можем гарантировать, что клиенты нашего приложения будут использовать только Internet Explorer, можно использовать любой из языков для работы со скриптами. Но на обычных web-сайтах, открытых для доступа самых разных клиентов, как правило, используется только один язык для браузерных скриптов — JavaScript.

JavaScript — очень популярный язык скриптов, который де-факто является стандартом для создания браузерных скриптов. Сразу заметим, что JavaScript никоим образом не является частью языка jаvа. JavaScript — это совершенно отдель­ный язык программирования, который предназначен для решения специальных задач и в котором предусмотрено гораздо меньше возможностей, чем в java. Jscript — это название реализации JavaScript от Мiсrоsоft.

Пример клиентского скрипта

Как правило, клиентские скрипты выполняются в ответ на события графических элементов HTML. Как же происходит перехват таких событий? Проще всего показать это на примере.

Предположим, что мы работаем с очень простой web-страницей, представленной на рис. 5. Единственная кнопка на этой странице будет называться testBtn (проще всего присвоить это имя из свойств кнопки). Чтобы настроить перехват события, возникающего при нажатии этой кнопки, перейдем в режим просмотра HTML и выберем нашу кнопку в левом ниспадающем списке. Затем в правом списке выберем для этой кнопки событие onclick (рис. 6).

Рис. 5. Новая страница HTML

Рис. 6. Перехват событий элементов управления HTML

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

Что такое код asp logextfileusername

Самым актуальный способом создать REST сервис в стеке технологий Майкрософт на сегодняшний день является ASP.NET Web API. До того эта технология значилась как WCF Web API и больше по названию тяготела к WCF. Но уже тогда там использовались сходные походы как в ASP.NET MVC, включая роутинг (routing). До нее существовали такие вещи как WCF 4 REST, WCF REST Starter Kit 3.5. Их все еще можно встретить на старых проектах и stackoverflow пестрит вопросами о них. Но то что ASP.NET Web API используется на новых проектах, а некоторые старые конвертируются, чтобы его использовать – радует. Так как предшественники были хуже как в плане технологии (приходилось писать много boilerplating code), удобства использования так и документации.

В предыдущих постах были рассмотрены некоторые теоретические аспекты REST – теперь создадим простой REST сервис с помощью Web API и рассмотрим ключевые элементы такого сервиса.
Начать стоит с подключения NuGet packages (и/или установки ASP.NET MVC):

  1. Web API, в случае если хостимся в ASP.NET:AspNetWebApi
  2. Self-hosted Web API:AspNetWebApi.Selfhost
  3. HttpClient включая XML и JSON форматеры:System.Net.Http.Formatting
  4. JsonValue для навигации и манипуляции JSON:System.Json

В нашем случае, мы создадим просто сервис, который хостится на ASP.NET MVC, а также посмотрим на принцип создания интеграционных тестов к нему, которые будут поднимать self-hosted REST сервис в тестовом контексте. Акцент на Data access layer делятся не будет, если в процессе вам необходимо прикрутить DAL, например, с использованием Entity Framework Code First, то я писал об одном из возможных подходов раньше.

Перед тем как создавать такой сервис необходимо также понимать что использовать Web API стоит если есть тесная связка с веб-клиентом, если сервис содержит логику выходящую за рамки CRUD операций. Если же у вас сервис по сути своей поставщик данных, т.е. операции в основном CRUD, то лучше использовать WCF Data Services, так как там много вещей из коробки генерится под базу — и CRUD операции и нормальная поддержка OData и IQuerable (в ASP.NET Web API она ограничена), которые позволяют делать запросы к сервису и данным с помощью Uri и специального OData синтаксиса.

Итак преступим. Для начала создадим новый проект ASP.NET MVC4:

Изображение 1
Естественно темплейт (шаблон) для MVC 4 нагенерит нам типичную структуру ASP.NET MVC проекта (файл ValuesController я уже успел переименовать на DocumentsController). Отличие в дополнительном контроллере для Web API. По умолчанию это ValuesController, естественно его необходимо переименовать.

В нашем случае он стал DocumentsController. Из темплейта этот контроллер содержит операции заглушки для Get, Post, Put, Delete. В просто случае переопределим эти операции для DocumentsController и ресурса Document. Получится вот такой вот контроллер:

Это простой вариант, и здесь не используются фильтры для обработки сообщений или dependency resolvers. В свою очередь IDocumentRepository реализовано как простая заглушка и если дальше развивать тему с нормальным доступом к данным то реализацию можно подставить любую.
Теперь проверим операции. Это сделать можно используя Fiddler и правильно сформировав запрос. Например операция получения всех документов, используем адрес http://127.0.0.1:81/api/documents/. Используется стандартный роутинг из коробки:

Итак, запрос на http://127.0.0.1:81/api/documents/ должен вызвать метод IEnumerable Get() :

Так и есть, нам вернулся список в виде XML из двух элементов. Теперь попробуем content negotiation из коробки в действии. К тому же самому вызову добавим HTTP заголовок – Accept:application/json. Итак запрос:

Ответ ожидаем в Json:

Из коробки идут два стандартных форматера – XML и Json, но есть возможность добавлять свои.

Аналогичным образом будут работать остальные операции. Единственное попробуем еще запросить документ с недействительным идентификатором. Будем вызывать метод Document Get(string id) по адресу http://127.0.0.1:81/api/documents/9505a3b549b54881b3ed83fc19510534, где 9505a3b549b54881b3ed83fc19510534 – недействительный идентификатор, изменили последнюю цифру.

Ожидается ответ 404 NotFound. Результат запроса:

Вот таким вот образом можно создать и протестировать на работоспособность простенький REST сервис на базе ASP.NET Web API.

Основные концепты — ApiController

Так как мы имеем дело с REST сервисом. То из всего этого добра нас интересуют на начальном этапе контроллеры и роутинг. Контроллеры для Web API REST сервиса наследуются от от класса ApiController, который в свою очередь от интерфейса IHttpController. И ApiController несет с собой много добра, кроме конечно того что она автоматом распознается и выполняется. Из всего этого добра самое интересное являются свойства Request и Configuration.

Основные концепты – Routing (Роутинг)

При вызове операций с контроллера важный момент играет routing. Именно routing позволяет подсистеме WebApi связать Uri адрес и конкретную операцию из контроллера. Причем есть несколько вариантов — либо операция-action помечается атрибутом, либо используется договоренность именовать операции с префиксом – Http Verb. Например, в методе PostDocument – именно префикс Post позволяет сказать Web Api что эта операция связанна с Uri и вызывается по соответствующему адресу с HTTP Verb – POST.
Еще одним вариантом для того, чтобы помочь выделить среди методов контроллера операции, которые связанны с URL – использование атрибутов — HttpGet, HttpPut, HttpPost, или HttpDelete, каждый из них соответствует такому же HTTP Verb – GET, PUT, POST, DELETE. Для того, чтобы навесить на операцию больше чем один HTTP Verb, или операцию отличную от 4 базовых (GET, PUT, POST, DELETE), используется атрибут – AcceptVerbs. Использование атрибутов также дает возможность отказаться от конвенции именования методов, когда префиксом выступает HTTP Verb.

А для того чтобы избежать мапинга (mapping) метода как action используется атрибут NonAction без параметров.
Есть еще способ роутинга, когда каждый мапинг делается по средством атрибутов на метод, а не глобальным роутингом через Global.asax.cs, но о нем позже, так как он не стандартный. Хотя на этапе WCF Web API использовался именно он.

Routing по-умолчанию в Web API устанавливается как в методе RegisterRoutes на изображении 5 ниже. При использовании такого routing необходимо придерживаться конвенции именования методов в контроллере, когда каждый метод начинается с HTTP Verb префикса.

Ну и естественно важная часть маппинга – routing в Global.asax.cs:

Соответственно под роутинг «api//» подпадают URLs и примерные имена методов:
Можно также сделать роутинг по имени action. Он не создается по-умолчанию темплейтом проекта. Например:
В случае с таким роутингом необходимо использовать атрибуты HttpGet, HttpPut, HttpPost, HttpDelete или AcceptVerbs чтобы указать на какие методы мапить . В WCF WebAPI использовался роутинг с помощью атрибутов, его тоже можно прикрутить, но об этом отдельно.

Основные концепты — HttpResponseMessage, HttpRequestMessage

По сути это два спец класса которые используются достаточно часто. Они нужны для того чтобы иметь возможность оперировать запросом и ответом. HttpRequestMessage можно получить через свойство Request от ApiController (Изображение 6). Tак как Web API контроллеры всегда наследуются от ApiController, то его можно получить в середине любого из наших контроллеров. HttpRequestMessage позволяет нам управлять запросом, например извлекать из него данные из HTTP Body либо HTTP Headers которые нам нужны.

HttpResponseMessage можно создать, чтобы вернуть результат, либо просто Response код (Изображение 7), либо еще и с нагрузкой, запаковав в его свойство Content, нужный нам HttpContent, например для бинарных данных подойдет наследник от HttpContent – StreamContent. Из свойства Request можно вычитать бинарные данные документа, который пришел с клиента:

Возврат ошибок — HttpResponseException

Вернуть ответ с ошибкой можно как с помощью HttpResponseMessage, указав код ошибки, так и с помощью специального класса HttpResponseException. Например, на изображении 7 на клиент возвращается ошибка InternalServerError = 500 с коротким описанием. Описание умеют читать далеко не все клиенты или клиентские библиотеки (были проблемы с iPad), в таком случае в тело сообщения с ошибкой можно писать объект более детально описывающий проблему, например свой кастомный объект с сообщением и кодом ошибки.

Хостинг

Само собой разумеется, что Web API REST сервис может хоститься на IIS либо вместе с ASP.NET MVC клиентом либо раздельно. Также его можно легко захостить вместе с ASP.NET MVC Web Role в облаке на Windows Azure. Но интересно, что Web API также можно хостить у себя в приложении, в памяти. Это значительно расширяет круг сценариев, в которых Web API может использоваться. Например с self-hosted Web API можно легко делать интеграционные тесты, которые поднимут во время тестирования self-hosted Web API сервис.

Например, на изображение 8 ниже, показано как поднимается с self-hosted Web API сервис для интеграционного теста в методе BecauseOf.

Клиент

Клиентов к Web API REST может быть большое множество – есть куча библиотек под разные платформы для REST, можно обращаться к REST сервису c веб страницы по средством JavaScript и jQuery, можно использовать “старенький” класс WebClient для десктоп клиента. Вместе с Web API новым для .NET является также новый HttpClient, который очень легко использовать с десктоп клиента или тестового сценария (пример на изображении 8 метод should_make_tivial_get), и к тому же он изначально спроектирован асинхронным.

Пример страницы ASP.NET

В основу разработки Web-приложений на ASP.NET положена модель разделения кода представления и кода реализации, рекомендуемая Майкрософт при создании динамических документов. Страницы ASP.NET имеют расширение .aspx. Программный код может размещаться либо в отдельном файле, либо на странице внутри специального тэга для сценариев. Файл с кодом обычно имеет расширение .aspx.cs (.aspx.vb) и имя, совпадающее с именем основного ASPX файла.

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

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

Наиболее часто используется директива @ Page, с помощью которой можно задавать множество параметров:

серверный язык программирования для кода на странице;

место нахождения кода сервера (непосредственно в странице или в отдельном файле класса);

параметры отладки и трассировки.

имеет ли страница связанную главную страницу.

Если директива @ Page не включена в страницу, или если эта директива не включает определенные настройки, параметры наследуются из файла конфигурации для приложения (файл Web.config) или из файла конфигурации узла (файл Machine.config). Наиболее важные атрибуты директивы перечислены в таблице 4.1.

Атрибуты директивы @ Page

AutoEventWireup Автоматическая обработка событий страницы
Buffer Управляет буферизацией страницы. По умолчанию буферизуется
ClassName Позволяет назначать имя класса, сгенерированного данной страницей
CodeFile Название файла с отделенным кодом для данной страницы
Culture Устанавливает набор региональных параметров, т.е. язык, формат валюты, даты, чисел
Debug Если true, на страницу выводится отладочная информация
Trace Вывод трассировочной информации
EnableViewState Сохранение состояния страницы. По умолчанию она сохраняется
EnableTheming Позволяет включить или выключить поддержку тем оформления. По умолчанию включено
Inherits Класс, от которого наследуется класс данной страницы в технологии отделенного кода
IsAsync Показывает, обрабатывается ли страница асинхронно.
Language Язык, используемый во внедренном коде
WarningLevel Наибольший допустимый уровень предупреждений компилятора
CompilerOptions Опции компилятора
Илон Маск рекомендует:  Faq system tray как добавить иконку на tray

Кроме директивы @ Page, в текст можно включить другие директивы, которые содержат дополнительные параметры, специфичные для страницы.

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

Примечание! Для лучшего понимания сущности описываемых процессов действия по созданию файлов рекомендуется выполнять в простом редакторе (например, Блокнот).

Возьмем за основу такую статическую страницу:

Идентификация в ASP.NET

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

Базовые понятия систем безопасности

Существуют два понятия, без которых невозможно обсуждение безопасности:

  • Аутентификация (authentication) – процесс определения личности пользователя, требующий верные логин и пароль, чтобы доказать, что он на самом деле тот, за кого себя выдает.
  • Авторизация (authorization) – это процесс выставления прав пользователю, прошедшего аутентификацию.

Способы аутентификации ASP.NET

Среда ASP.NET предоставляет три способа аутентификации:

  • Windows – аутентификация на основе системы диспетчера локальной сети Windows
    NT.
  • Forms – аутентификация на основе cookies.
  • Passport – аутентификация с помощью службы Passport от
    Microsoft.

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

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

Этот знак — (?) — обозначает всех анонимных пользователей. А включая это правило вы запрещаете им доступ. Теперь каждый пользователь должен быть аутентифицирован, и каждый
не аутентифицированный будет перенаправлен на страницу регистрации.

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

Небольшие пояснения: параметр loginUrl в теге authentication указывает на страницу регистрации (по умолчанию – default.aspx), а параметр passwordFormat в теге credentials означает, что логин и пароль не зашифрованы (альтернативы – использовать алгоритмы шифрования SHA1 и MD5. О них мы поговорим позже ).

Для проверки верности логина и пароля будем использовать метод
FormsAuthentication. Authenticate(string login,string pass). А для регистрации пользователя в приложение ASP.NET путем создания cookie, и перенаправления на страницу, которая была изначально запрошена пользователем, будем использовать метод
FormsAuthentication. RedirectFromLoginPage(string login, bool CreatePersistentCookie) (второй параметр указывает на то,
каким будет посланный cookie – постоянный (срок годности
— 50 лет, значение true) или нет (false)).

Вот, собственно, и сам код страницы регистрации:

Храните данные о пользователе в ASP.NET Identity

ASP.NET Identity в Visual Studio 2013 — это способ, который упрощает выполнение утомительных, но важных задач по управлению данными о пользователях и организации более эффективной системы членства в группах. Ранее я давал обзор ASP.NET Identity API (msdn.microsoft.com/magazine/dn605872) и исследовал его работу с социальными сетями и протоколом OAuth (msdn.microsoft.com/magazine/dn745860). В этой статье я уделю основное внимание точкам расширения ASP.NET Identity, начиная с представления данных о пользователе и нижележащего хранилища данных.

Основы

Для начала давайте создадим новый пустой проект ASP.NET MVC в Visual Studio 2013. Нам подходит все, что предлагается мастером по умолчанию, но вы должны обязательно выбрать единую модель аутентификации пользователей (single user authentication model). Генерируемый шаблоном код хранит данные о пользователях в локальном файле SQL Server с автоматически генерируемым именем в соответствии с соглашением: aspnet-[ProjectName]-[RandomNumber]. Этот код также применяет Entity Framework для доступа к базе данных пользователей при чтении и записи. Представление данных о пользователе находится в классе ApplicationUser:

Как видите, класс ApplicationUser наследует от системного класса IdentityUser. Для адаптации представления о пользователе начнем отсюда и добавим в класс новый член:

Имя класса (ApplicationUser) в этом примере не является обязательным, и вы можете изменять его как угодно. В данном примере я умышленно выбрал поле со странным названием MagicCode, чтобы указать на двоякую возможность. Вы можете добавлять поля, требующие UI, например, для ввода даты рождения или номера карты социального страхования, или чего угодно другого, что вы хотите определять при регистрации. Кроме того, можно добавлять обязательные поля, но вычислять их автоматически (скажем, специфичный для приложения магический код) при реальном создании записи о пользователе. Класс ApplicationUser включает по умолчанию члены, перечисленные в табл. 1.

Табл. 1. Члены, определенные в базовом классе IdentityUser

Член Описание
Id Уникальный автоматически генерируемый идентификатор (GUID) для таблицы. Это поле является основным ключом
UserName Отображаемое имя пользователя
PasswordHash Хеш, получаемый на основе предоставленного пароля
SecurityStamp GUID, автоматически создаваемый в определенные моменты жизненного цикла объекта UserManager. Обычно создается и обновляется при смене пароля или добавлении/удалении логина через социальные сети. Метка безопасности (security stamp), как правило, создает снимок информации о пользователях и обеспечивает автоматический вход пользователей, если ничего не изменялось
Discriminator Это поле специфично для модели сохранения Entity Framework и определяет класс, к которому относится конкретная строка. У вас будет уникальное значение этого поля для каждого класса в иерархии с корнем в IdentityUser

Поля, перечисленные в табл. 1, а также любые другие поля, добавляемые вами программным способом в определение класса ApplicationUser, в конечном счете сохраняются в таблице базы данных. Имя таблицы по умолчанию — AspNetUsers. Кроме того, класс IdentityUser предоставляет несколько свойств, таких как Logins, Claims и Roles. Эти свойства хранятся не в таблице AspNetUsers, а в других побочных таблицах в той же базе данных: AspNetUserRoles, AspNetUserLogins и AspNetUserClaims (рис. 1).


Рис. 1. Структура по умолчанию базы данных о пользователях ASP.NET Identity

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

Изменения в сгенерированном шаблоном коде

Вам потребуется отредактировать представления и модели приложения, чтобы отразить новые поля. В форму приложения, где на сайте регистрируются новые пользователи, нужно добавить разметку, которая будет показывать UI для магического кода и прочих дополнительных полей. На рис. 2 показан измененный код для CSHTML-файла Razor, отделенного от формы регистрации.

Рис. 2. Razor-файл для представления пользователей с дополнительными полями

CSHTML-форма регистрации основана на классе модели представления, обычно называемом RegisterViewModel. На рис. 3 показаны изменения, которые нужно внести в класс RegisterViewModel, чтобы включить его в традиционный для большинства приложений ASP.NET MVC механизм проверки, основанный на аннотациях данных.

Рис. 3. Изменения в классе модели представления регистрации

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

Основное изменение — сохранение отправленных данных для магического кода (или чего угодно другого, что вы решили добавить в определение пользователя). Они сохраняются в экземпляре ApplicationUser, передаваемом методу CreateAsync объекта UserManager.

Постоянное хранилище

В образце кода, сгенерированном шаблоном ASP.NET MVC, у класса AccountController имеется член, определенный ниже:

Экземпляр класса UserManager создается передачей объекта хранилища пользователей. ASP.NET Identity предоставляет хранилище пользователей по умолчанию:

Во многом по аналогии с ApplicationUser, класс ApplicationDbContext наследует от системного класса IdentityDbContext и обертывает Entity Framework для выполнения реальной задачи сохранения. Отличная новость в том, что вы можете напрочь отключить механизм хранения по умолчанию и развернуть собственный. Свой механизм хранения вы можете базировать на SQL Server и Entity Framework и просто задействовать другую схему. Вы также могли бы использовать преимущества совершенно другого механизма хранения, такого как MySQL или NoSQL. Давайте рассмотрим, как организовать хранилище пользователей на основе встраиваемой версии RavenDB (ravendb.net). Прототип класса, который понадобится вам, показан ниже:

Если вы намерены поддерживать логины, роли и заявки (claims), вам придется реализовать больше интерфейсов. Для минимально работающего решения достаточно IUserStore и IUserPasswordStore. TypicalUser является классом, созданным мной для того, чтобы сохранить максимально возможную обособленность от инфраструктуры ASP.NET Identity:

Как минимум, класс пользователя должен реализовать интерфейс IUser. В этом интерфейсе два члена: Id и UserName. Скорее всего вы захотите добавить и член Password. Это класс пользователя, сохраняемый в архиве RavenDB.

Добавьте поддержку RavenDB в свой проект с помощью NuGet-пакета RavenDB.Embedded. В global.asax вам также понадобится инициализировать базу данных следующим кодом:

Строка подключения указывает на путь, по которому вы должны создать базу данных. В веб-приложении ASP.NET для этого естественным образом подходит подкаталог в App_Data:

Класс хранилища пользователей содержит код для методов в интерфейсах IUserStore и IUserPasswordStore. Они позволяют приложению управлять пользователями и соответствующими паролями. Реализация хранилища показана на рис. 4.

Рис. 4. Минимально работающее хранилище пользователей на основе RavenDB

Любое взаимодействие с RavenDB передается через открытие и закрытие сеанса работы с хранилищем документов (document store session). В конструкторе RavenDbUserStore вы открываете сеанс и закрываете его в методе Dispose объекта хранилища. Но перед закрытием сеанса вызовите метод SaveChanges, чтобы сохранить все незавершенные изменения в соответствии с шаблоном Unit-of-Work:

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

Чтобы получить заданного пользователя, вызовите метод Query объекта DocumentSession:

RavenDB предполагает, что в любом сохраняемом вами классе есть свойство Id. Если его нет, оно создается неявно, чтобы вы всегда могли использовать метод Load для получения любого объекта по Id — будь то ваш идентификатор или сгенерированный системой. Чтобы получить пользователя по имени, выполните классический запрос с применением синтаксиса LINQ:

Для выборки самых разнообразных объектов и сохранения их в управляемом списке используйте ToList. Работа с паролями так же проста. RavenDB хранит пароли в хешированном формате, но управление хешированием осуществляется вне модуля RavenDB. Метод SetPasswordHashAsync, по сути, получает уже хеш пароля, предоставленного пользователем.

На рис. 4 дан полный исходный код для такой подготовки хранилища пользователей RavenDB, чтобы оно было совместимо с ASP.NET Identity. Если у вас установлена встраиваемая версия RavenDB, достаточно реализовать вход и выход пользователей. Для поддержки более сложной функциональности, такой как внешние логины и управление учетными записями, нужно реализовать все относящиеся к пользователям интерфейсы ASP.NET Identity или значительно переработать код в AccountController, который вы получаете результате генерации кода шаблоном.

Заключение

ASP.NET Identity позволяет полностью отключить инфраструктуру хранилища на основе Entity Framework и вместо нее задействовать RavenDB — базу данных документов безо всяких схем. Вы можете установить RavenDB как Windows-службу, IIS-приложение или как встраиваемый компонент (я как раз показал вам последний вариант). Просто напишите класс, реализующий несколько интерфейсов ASP.NET Identity, и встройте этот новый класс хранилища в инфраструктуру UserManager. Изменить схему типа пользователя легко, даже в исходной конфигурации на основе EF. Но, если вы применяете RavenDB, то избавляетесь от любых проблем миграции в случае изменения формата пользователя.

Дино Эспозито (Dino Esposito) — соавтор книг «Microsoft .NET: Architecting Mobile Applications Solutions for the Enterprise» (Microsoft Press, 2014) и «Programming ASP.NET MVC 5» (Microsoft Press, 2014). Идеолог в области технологий для платформ .NET Framework и Android в JetBrains. Часто выступает на конференциях по всему миру, делится своим видением ПО на software2cents.wordpress.com и пишет заметки в twitter.com/despos.

Выражаю благодарность за рецензирование статьи эксперту Мауро Сервиенти (Mauro Servienti).

. Часть 1

Интерфейс к базе данных с помощью ASP

Постановка задачи

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

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

Я почти уверен, что подобная задача актуальна применительно практически к любому сайту, тем более что подобным образом (разве что без возможностей поиска, сортировки и удаления) работает большинство гостевых книг (guestbook).

Что нам понадобится

Для реализации вышеизложенной задачи нам потребуется персональный компьютер с Microsoft Windows NT или Windows 2000 (можно и Workstation, и Server), установленный IIS (Internet Information Server), какой-нибудь HTML-редактор (советую использовать Macromedia Dreamweaver), Microsoft Access (версии 95, 97 или 2000) и самый обычный текстовый редактор.

Создание и подготовка базы данных

Прежде всего создадим базу данных статей, для чего:

  • запустим приложение Microsoft Access;
  • любым из известных способов создадим новую базу данных. Назовем ее «Articles»;
  • в созданной базе данных создадим таблицу с именем, например «Articles»;
  • пользуясь инструментом «Конструктор», определим поля нашей таблицы и типы принимаемых ими значений (рис. 1);
  • заполним таблицу несколькими статьями в соответствии с созданными полями (рис. 2);
  • сохраним базу данных в файле «ArticlesDB.mdb».

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

  • запустим программу-конфигуратор источников данных (Data Sources ODBC) — Start->Settings->Control Panel->Administrative Tools->Data Sources ODBC;
  • перейдем во вкладку «System DSN» и создадим новый источник данных, нажав на «Add…»;
  • в появившемся списке драйверов выберем драйвер баз данных Microsoft Access — «Microsoft Access Driver (*.mdb)» и нажмем на «Finish»;
  • в строке «Data Source Name» зададим имя нашей базы данных, например «Articles» (это то имя, по которому мы в дальнейшем будем обращаться к ней);
  • нажмем на «Select…», выберем подготовленный нами файл «ArticlesDB.mdb» и нажмем «OK».

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

Оформляем главную страницу (index.asp)

С ASP работать очень просто. Для этого надо всего лишь вставить текст скрипта ASP в пару тэгов . В остальном ASP-файл ничем не отличается от HTML-файла (за исключением, пожалуй, расширения). Комментарии в HTML, как известно, вставляются в пару тэгов , в ASP же закомментировать строку можно при помощи символа ‘ (апостроф) в ее начале.

Теперь давайте разберемся. Во-первых, как вы наверняка заметили, ASP-код легко сочетается с HTML-тэгами; в этом его достоинство. Так, к примеру, строка Response.Write Link & «
» отображает на экране браузера клиента подготовленное сервером значение переменной Link и HTML-тэг
, то есть перевод строки. Особый интерес вызывает переменная rs. Для искушенных программистов сразу скажу — это указатель. Однако в ASP с целью облегчения работы начинающих указатели маскируются. Здесь не встретишь громоздких С’шных конструкций, типа «я знаю, что ты знаешь, что я знаю», или, выражаясь программистским языком, указатель на указатель… Однако сделано это так искусно, что гибкость программирования при этом не теряется, нет лишь прямой работы с указателями, а только работа с помощью специальных функций, скрывающих от программиста рутину и защищающих указатели от некорректных действий. Таким образом, выражение rs.Fields («Article»).value означает значение поля «Article» текущего значения указателя на элемент базы данных (в нашем случае статей) и содержит текст статьи, которая соответствует текущей позиции указателя на все статьи. Переход к следующему элементу базы (смещение указателя) выполняется с помощью инструкции Rs.MoveNext. В приведенном выше примере это не делается, а попросту формируется ссылка на текст статьи в виде ее названия и отображается комментарий самой первой статьи, соответствующей результату запроса. Давайте попробуем отобразить все статьи нашей базы данных на главной странице в виде HTML. И еще, обратите особое внимание на директиву:

Илон Маск рекомендует:  Что такое код wddx_deserialize

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

Первая строчка скрипта шаблона HTML присваивает переменной TheID значение, переданное ссылкой с использованием метода Request.QueryString. Далее открывается база данных, из которой читается статья (запись), соответствующая идентификатору, переданному из главного скрипта (index.asp).

Создаем главную страницу

Таким образом в таблицу в цикле будут добавляться ряды со ссылками на статьи и с аннотациями, пока не будут отображены все статьи из базы данных. Следует обратить внимание на переменную Cnt. По окончании цикла она будет содержать число обработанных статей (рядов таблицы).

Язык структурированных запросов — SQL

Настала пора разобраться с тем, что таится за строчками:

По сути, именно за этими двумя строчками кроется работа с нашей базой данных: первая представляет собой текстовую строку с запросом к базе данных (текстовые строки в ASP записываются в двойных кавычках); вторая — содержит директиву выполнения этого запроса с одновременным присвоением результата переменной (указателю на записи в базе данных). В рамках настоящей статьи мы не будем рассматривать SQL (Structured Query Language) во всех деталях, а остановимся лишь на тех его операторах, без понимания которых дальнейшая работа будет невозможна. Для тех, кому этого покажется недостаточным, советую посетить отобранные мною сайты с детальной документацией по SQL.

Для полноценной работы нам необходимо познакомиться с четырьмя операторами этого мощного языка, предназначенного специально для работы с базами данных.

DELETE удаляет те ряды из «Имя Таблицы», которые удовлетворяют условию, определенному в «Определении», и возвращает число удаленных рядов. Если выполнить команду DELETE без условия WHERE, то все ряды указанной таблицы будут удалены. В этом случае DELETE возвратит 0. Ключевое слово LOW_PRIORITY откладывает выполнение операции DELETE до завершения работы чтения из таблицы других клиентов.

SELECT используется для извлечения рядов (записей) из одной или более таблиц. Выражение_Select определяет столбцы таблицы, значения которых необходимо извлечь. Все ключевые поля должны быть заданы в строгой последовательности. К примеру, выражение HAVING должно следовать за любым выражением GROUP BY и до любого выражения ORDER BY.

Выражение_Select можно заменить псевдонимом (alias) с помощью ключевого слова AS. Псевдоним используется в качестве идентификатора имени столбца и может быть использован наряду с ключевыми словами ORDER BY или HAVING.

Выражение HAVING может относиться к любому столбцу или псевдониму в Выражении_Select. Оно применяется к запросу в последнюю очередь, непосредственно перед посылкой данных клиенту. SELECT . INTO OUTFILE ‘имя_файла’ заносит отобранные записи в файл. Файл создается непосредственно на сервере и не может «уже существовать» (одна из основных причин такого механизма заключается в предотвращении случайного «затирания» различных важных файлов).

INSERT используется для добавления новых записей в существующую таблицу. Допустимо две формы использования INSERT.

Первая форма — INSERT . VALUES — вставляет ряды на основании заданных значений. Вторая форма — INSERT . SELECT — вставляет ряды, выбранные из другой таблицы.

Ключевое слово LOW_PRIORITY откладывает выполнение операции до завершения работы чтения из таблицы других клиентов. Ключевое слово IGNORE в команде INSERT позволяет избегать вставки повторяющихся строк (используется в сочетании с ключевыми словами PRIMARY или UNIQUE). Для второй формы INSERT INTO . SELECT операция не может содержать выражения ORDER BY. Таблица, в которую производится добавление записей, не может присутствовать в выражении FROM части SELECT запроса потому, что запрещено производить выделение из той же самой таблицы, в которую производится вставка.

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

UPDATE обновляет поля существующей таблицы новыми значениями. Выражение SET показывает, какие поля (столбцы) должны быть изменены, и значения, которые должны быть им присвоены. Выражение WHERE, если оно есть, указывает, какие ряды должны быть обновлены. В противном случае операция применяется ко всем рядам таблицы. Ключевое слово LOW_PRIORITY откладывает выполнение операции до завершения работы чтения из таблицы других клиентов. Выражения UPDATE выполняются слева направо.

Обновляет значение поля Password в таблице WAPassword, записывая в поле, чей идентификатор ID равен 1 значение ‘passw’.

Увеличивает значение поля counter таблицы Счетчик на 1.

Удваивает поле age, а затем прибавляет 1 к его значению в таблице persondata.

Что такое Global.asa

Global.asa позволяет выполнять определенные скрипты в начале работы клиентской сессии или при инициализации IIS. Примером тому может служить простейший счетчик числа посещений сайта. Более того, допустимо использовать множественные файлы Global.asa. Однако следует помнить, что ASP-скрипт ищет самый близкий (расположенный в том же каталоге) файл Global.asa и использует именно его.

По сути, этот файл может содержать четыре скрипта: первый будет выполняться при инициализации службы IIS/PWS (Application_OnStart), второй — при остановке службы IIS/PWS (Application_OnEnd) (обычно эти первые два скрипта отрабатывают в процессе перезагрузки компьютера), и еще два скрипта выполняются дополнительно при инициализации сессии пользователя (Session_OnStart) и по ее окончании (Session_OnEnd). Данная схема очень сильно напоминает пары «конструктор-деструктор». Неспроста всякая переменная, которая должна быть использована (например, в текущей сессии), может быть инициализирована в Session_OnStart с тем, чтобы быть использованной в процессе работы сессии, она же уничтожается (обнуляется) в Session_OnEnd.

Global.asa не может содержать тэгов HTML. Недопустимо использование JavaScript. Не рекомендуется писать файл Global.asa с помощью каких-либо HTML-редакторов, для этого гораздо лучше использовать NotePad. И еще один совет: прежде чем вставлять скрипт в файл Global.asa, попробуйте его в работе в обычном ASP-файле.

Пример файла Global.asa

Добавляем новую статью (UploadForm.asp и Upload2DBS.asp)

Теперь, когда мы разобрались с SQL, можно приступать к добавлению новой статьи, причем делать мы это будем прямо с сайта, а если быть точнее — непосредственно с HTML-формы. Для этого сначала создадим файл с самой формой и определим скрипт-реакцию на подтверждение (кнопку «Publish the article!»). (Предполагается, что читатель знаком с азами построения HTML-форм, поэтому мы рассмотрим этот процесс, не вдаваясь в детали построения форм.)

Прежде всего следует уточнить задачу на этом этапе. Итак, очевидно следующее:

  • на загрузку статьи с сайта должен иметь право не каждый (следовательно, желательно предусмотреть пароль для доступа к этой функции);
  • у каждой статьи есть определенная тема (рубрика), причем она не может быть произвольной, а должна выбираться из списка;
  • список можно хранить непосредственно в HTML-файле и, каждый раз изменяя его, изменять сам файл. Это самый простой и быстрый способ;
  • однако для того, чтобы позволить динамически изменять и пополнять этот список, рекомендуется держать его в базе данных. Это позволит пользователям произвольным образом изменять его содержимое и не потребует переделки формы. Для простоты сначала рассмотрим вариант со встроенным («жестко прошитым») рубрикатором.

Как видим, передача управления осуществляется благодаря директиве ACTION=»http://localhost/Upload2DBS.asp»> в тэге формы. Тем самым указывается скрипт-ответ на реакцию пользователя после нажатия на кнопку «Publish the article!». Теперь остановимся на селекторе рубрик. Как уже отмечалось, желательно перевести его содержимое в базу данных. Для этого в нашей базе данных (файл ArticlesDB.mdb) создадим новую таблицу с именем, к примеру «Topics», в которой с помощью конструктора определим всего одно поле — «Topic» типа «текст». Далее заполним эту таблицу произвольными значениями нашего рубрикатора и отсортируем полученный список в алфавитном порядке. После чего следует заменить тэг

Теперь давайте разберемся с самой сутью дальнейшей работы. Что же должен делать наш скрипт-реакция?

Во-первых, следует позаботиться о том, чтобы все обязательные поля (а они отмечены звездочкой) были введены. Наиболее правильным способом проверки этого является скрипт, написанный на любом языке описания скриптов (например, JavaScript), который будет проверять, введены ли значения обязательных полей. Для этого достаточно добавить в определение тэга формы параметр onsubmit=»preprocess();», где preprocess() — имя функции-скрипта, который и будет осуществлять проверку. Здесь как нельзя кстати видно преимущество языков описания сценариев (JavaScript, Jscript, VBScript) перед ASP. ASP выполняется на стороне сервера, а перегружать связь «клиент-сервер» простой проверкой типа «введены ли значения», согласитесь, неправильно. Однако специально в целях обучения мы будем делать это с помощью ASP.

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

Удаляем статью (RemoveForm.asp и Rem.asp)

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

Особое внимание следует уделить первым двум строкам. Они получают значение глобальной переменной текущего сеанса (сессии) работы со значением идентификатора текущей статьи (в нашем случае удаляемой), которая была инициализирована (файл ArtTmp.htm) следующей строкой:

Таким образом, в текущий скрипт передается в качестве параметра сеансовая переменная с идентификатором текущей статьи, которую необходимо удалить. Имеется в виду, что ссылка на удаление присутствует в странице с шаблоном (файл ArtTmp.htm) и удаляемая статья является текущей.

Организуем поиск (SearchForm.asp и SearchDBS.asp)

Как известно, без поиска навигация в сколь-нибудь солидной базе данных невозможна в принципе. Попробуем организовать поиск статьи по ее реквизитам, причем постараемся организовать булев (логический) поиск, соединяя отдельные значения критериев поиска с помощью логики «И/ИЛИ».

Опять же не заостряя внимание на поисковой форме (файл SearchForm.asp), перейдем непосредственно к самому процессу поиска:

Самое интересное происходит при формировании запроса к базе из составляющих:

В зависимости от введенной пользователем комбинации исходных полей из этих компонентов формируется окончательный запрос, в частности для полей «Author» и «Title». Возможны четыре случая: оба поля пусты, пусто первое поле, пусто второе поле и оба поля не пусты. Соответствующая строка SQL-запроса в каждом из этих случаев формируется по-своему. То же самое относится к состоянию селекторов рубрик статей и порядку их сортировки. При добавлении той или иной подстроки учитывается состояние «радиокнопок» И/ИЛИ и соответствующая подстрока добавляется в SQL-запрос, предваряясь логическим элементом «and» или «or» соответственно. После того как окончательный запрос сформирован, он выполняется, а результирующая страница формируется исходя из списка статей, удовлетворяющих критериям.

Полный код приведенных в статье примеров, включая файл базы данных, находится на нашем CD-ROM.


И в заключение

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

Среди множества инструментальных средств, служащих для облегчения создания ASP-приложений, выделяются два: Easy ASP © Eric Banker, 2000 и Microsoft InterDev из комплекта Microsoft Visual Studio 6.0. Первый — очень удобное, несложное и небольшое средство для быстрого создания ASP-приложений. Второй представляет собой мощный, тяжеловесный интегрированный пакет в духе Microsoft для разработки всевозможных Web-приложений.

Временная версия EasyASP 4.0 находится на нашем CD-ROM.

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

http://www.15seconds.com/issue/000210.htm — создание динамичных JavaScript-скриптов с помощью ASP и интерфейсов к базам данных

http://www.alphasierrapapa.com/iisdev/ — сайт, посвященный разработке серверов IIS с помощью ASP

http://www.websiteresources.com/ — огромная база исходных текстов всевозможных Web-программ

Примеры ASP-кода для профессионалов

http://www.asptoday.com/search.asp?category=ASP Tricks — масса полезных советов для начинающих программировать на ASP

http://www.oreilly.com/catalog/aspnut/ — замечательная книга популярнейшей серии «In a Nutshell» всемирно известного издательства O’REILLY «ASP in a Nutshell A Desktop Quick Reference». На сайте бесплатно размещена одна из глав книги

http://www.chilisoft.net/ — версии ASP для различных платформ можно скачать с этого сайта

http://www.willcam.com/sql/ — введение в структурированный язык запросов SQL

SQL Reference and Example Site — хорошо структурированный материал по SQL

How to get the current logged in user > Ask Question

I’ve done this before with MVC5 using User.Identity.GetUserId() but that doesn’t seem to work here. The User.Identity doesnt have the GetUserId() method

I am using Microsoft.AspNet.Identity

13 Answers 13

Until ASP.NET Core 1.0 RC1 :

It’s User.GetUserId() from System.Security.Claims namespace.

Since ASP.NET Core 1.0 RC2 :

You now have to use UserManager. You can create a method to get the current user :

Что такое код asp logextfileusername

I am getting a Security Exception while trying to write to the event log. I am logged on as an Administrator, have set the trust level to high and >
Server Error in ‘/ASP.NetProjects/EventLog’ Application.
———————————————————————————

Security Exception
Description: The application attempted to perform an operation not allowed by the security policy. To grant this application the required permission please contact your system administrator or change the application’s trust level in the configuration file.

Exception Details: System.Security.SecurityException: Request failed.

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Thankyou,
Aanchal. Sign In· View Thread

Re: Event Log Security Exception

Shawn Cicoria 17-Dec-05 0:06

You need to grant permissions to the ASP.NET worker process account. If running under XP it is by default asp_net user. If Windows 2003, than Network Service is the account.

The permissions are granted in the registry. You need to check the ASP.NET security issues and logging. This is a common problem and I’m sure MSDN has some pointers.

This example is writing to the IIS log, not the event log.

Shawn Cicoria
shawn@cicoria.com

Sign In· View Thread
Off by one error in cookie buffer termination?

Ty Durden 15-Nov-05 19:17
It looks like you’re terminating the cookie buffer at the 4097th byte. but the buffer is 4096 bytes long.

DWORD CIsapiLoggerFilter::OnLog(CHttpFilterContext* pCtxt,
PHTTP_FILTER_LOG pLog)
<
char szBuffer[bufferSize] = «\0»; //NULL;
DWORD dwSize = bufferSize;

pCtxt->GetServerVariable(«HTTP_COOKIE», szBuffer, &dwSize);
if (strlen (szBuffer) > 0) <
pLog->pszClientUserName = getUserName(szBuffer);
>
return SF_STATUS_REQ_NEXT_NOTIFICATION;
>

Shouldn’t this be:

char szBuffer[ bufferSize — 1 ] = «\0»; //NULL;
DWORD dwSize = bufferSize — 1 ;

Great article. Many thanks for a simple working example!

TDurden

Sign In· View Thread
Re: Off by one error in cookie buffer termination?

Shawn Cicoria 16-Nov-05 3:22

Shawn Cicoria
shawn@cicoria.com

Sign In· View Thread
IIS AUTHENTICATION?

SherKar 27-Sep-04 23:24
hi,
when i start my ASP.NET app it gives me error msg says unhandeled exception it may be caused by the IIS that it didn’t register a vrtual directory
and it marks the part of the authenication code in the web config file
can any one wt can i do to solve this problem ?
Sign In· View Thread
Problems with the filter smcintyr_11 19-Jan-04 13:10
I downloaded the filter and made changes to the registry. But when I setup the ISAPI filter, it will not load. It’s status is always «Not Loaded». What am I doing wrong?
Sign In· View Thread
Re: Problems with the filter Shawn Cicoria 19-Jan-04 14:11

Need to make sure it’s compiling properly and that the DLL’s that it references are available in the path.

One way to check is to create an «empty» filter that does next to nothing and see if it’s loaded. If not, then it’s the references to the supporting DLL’s.

If you have the resource kit or Visual Studio, try to use the «depends.exe» utility to track down what DLL’s this references. It could be your using a debug build and the box you deploy on doesn’t have those DLL’s.

Let me know how that works.

Shawn Cicoria
shawn@cicoria.com

Sign In· View Thread
Re: Problems with the filter

Ted Broyles 20-Apr-04 10:13

I am having a similar problem when I try to deploy to a windows 2000 server. My XP Box and Windows 2003 server have no problems loading this ISAPI filter.

I have used the depends utility and verified that MFC71.dll and MSVCR71.dll are in the system32 directory.

I have also created an empty ISAPI project and have experienced the same results. So it pretty obvious I’m missing a standard file. Any ideas?

Ted Broyles

Sign In· View Thread
Re: Problems with the filter

Shawn Cicoria 20-Apr-04 10:25

Make sure you run the full dependancy the actual DLL that get’s created. Then you need to walk the full «tree» ensure you dont see MSVCR71D.DLL (debug version).

I just ran it on the one in my demo project it’s not dependant upon MFC or MSVCR — instead mscoree.dll — which is the .NET main DLL.

So, what does that mean? Well, I created a managed C++ DLL instead of a normal Win32 dependant upon MFC/VCRT.

However, for the purpose of the article, which was just to show how to enable userName logging in the IIS logs, the article is still OK.

Shawn Cicoria
shawn@cicoria.com

Sign In· View Thread
Convert from C# to VB.NET possible?

ruseno 1-Sep-03 6:30
I’ve read your article from top to bottom and was very pleased with it.

But I have a problem.
My website is made with WebMatrix and is in VB.NET

Is it possible for you to translate the cookie code to VB.NET?

Kind regards,
Ruben Noorderijk

Kind regards,
Ruben Noorderijk

Sign In· View Thread
Re: Convert from C# to VB.NET possible?

Shawn Cicoria 1-Sep-03 8:09

Shawn Cicoria
shawn@cicoria.com

Sign In· View Thread
Re: Convert from C# to VB.NET possible?

ruseno 3-Sep-03 10:51

How do I put this in my page, because all I get are errors when I try to view the login page.

I only use WebMatrix as my webdesign tool.

Can I mail you the login page, so you can see for yourself?
Or is this very simple.

Kind regards,
Ruben Noorderijk

Sign In· View Thread
good

Jesus Oliva 17-Dec-02 4:01
Interesting article Shawn. I am searching information about ISAPI and i think your article is a good example. Thanks.

Jesus Oliva

Sign In· View Thread
Last Visit: 13-Nov-19 5:26 Last Update: 13-Nov-19 5:26 Refresh 1

General News Suggestion Question Bug Answer Joke Praise Rant Admin

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Get Username for logged in user [Answered] Locked RSS

16 replies

Shortcuts

Get Username for logged in user

Nov 08, 2007 05:20 PM | ronhawker | LINK

If I use Environment.UserName.ToString I get «Network Service».

If I run the application in debug locally I get the Domain\username but not when I run it on our intranet.

Re: Get Username for logged in user

Nov 08, 2007 05:28 PM | DkUltra | LINK

Hope this helps

Re: Get Username for logged in user

Nov 08, 2007 05:34 PM | ronhawker | LINK

We are not using membership controls if that is what you are assuming. That forum thread seems to be using the membership class.


Re: Get Username for logged in user

Nov 08, 2007 06:36 PM | doyleits | LINK

It probably has to do with impersonation and IIS settings. When you develop, you probably have this in your web.config:

identity impersonate = » true » />

authentication mode = » Windows » />

But when you move the app to production (on your intranet) you may need to comment these out, and configure IIS to use Windows Authentication and not allow anonymous users.

Re: Get Username for logged in user

Nov 12, 2007 04:39 AM | Zhao Ji Ma — MSFT | LINK

In ASP.NET, please use User.Identity.Name to get the logon user. User.Identity.Name might be empty if Anonymous Authentication is enabled in IIS.

Here is the logical to check if the identity is available.

VB.NET

‘ Gets the name if authenticated.
If User.Identity.IsAuthenticated Then
Label1.Text = User.Identity.Name
Else
Label1.Text = «No user identity available.»
End If

C#

‘ Gets the name if authenticated.
if (User.Identity.IsAuthenticated)
Label1.Text = User.Identity.Name;
else
Label1.Text = «No user identity available.»;

Environment.UserName is the running thread identity. If you have enabled Impersonation as Mark said, you can find out the returning result will be different. However this requires ASP.NET Impersionation. If you don’t need ASP.NET Impersonation and dealing with the thread identity, you can ignore Environment.UserName if and just use User.Identity.Name.

Zhao Ji Ma
Sincerely,
Microsoft Online Community Support

“Please remember to click “Mark as Answer” on the post that helps you, and to click “Unmark as Answer” if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread. ”

Re: Get Username for logged in user

Nov 13, 2007 02:17 PM | ronhawker | LINK

Will that operate under the same IIS rules?

Re: Get Username for logged in user

Nov 19, 2007 09:03 PM | Zhao Ji Ma — MSFT | LINK

The server variable Auth_User is equivalent to User.Identity.Name when you are using Windows Authentication.

Zhao Ji Ma
Sincerely,
Microsoft Online Community Support

“Please remember to click “Mark as Answer” on the post that helps you, and to click “Unmark as Answer” if a marked post does not actually answer your question. This can be beneficial to other community members reading the thread. ”

Re: Get Username for logged in user

Feb 12, 2008 03:23 PM | ronhawker | LINK

I have tried all of the following and still get no user identity. The application requirement got hot again so I am revisiting.

Protected Sub Page_Load( ByVal sender As Object , ByVal e As System.EventArgs)

‘ Gets the name if authenticated.

If User.Identity.IsAuthenticated Then

Label1.Text = «No user identity available.»

Re: Get Username for logged in user

May 05, 2008 09:22 AM | Shital Gosavi | LINK

i was also getting the same error.I did following things and it start working :)

Uncheck the Anonymous Access in IIS

Removed allow users = » * » /> from Authorization section in web.config

Re: Get Username for logged in user

May 05, 2008 09:56 AM | BryianTan | LINK

Re: Get Username for logged in user

Oct 08, 2010 11:37 AM | mnandha | LINK

I’m also facing the same issue in my asp.net webservice and this is what I have in web.config file

Re: Get Username for logged in user

Oct 25, 2010 05:14 PM | Albeli | LINK

I am facing the same issue.

I want to have windows authentication. If a user is authenticated from the active directory, I check if the person is active in SAP. If the person is not active in SAP then I want to give them a login box to scan their employee card with ID on.Then I want to authenticate that with AD and then set them as the current HttpContext user.

Any help will be greatly appreciated.

Re: Get Username for logged in user

Oct 26, 2010 03:53 AM | Rameezwaheed | LINK

Dim User As System.Security.Principal.IPrincipal
User = System.Web.HttpContext.Current.User

Re: Get Username for logged in user

Oct 26, 2010 05:10 PM | Albeli | LINK

I am using c#. I have that code after the user login using the login window. Should I have windows authentication or form authenitication turned on in the web.config file. Currently I have windows authenitcation on.

Re: Get Username for logged in user

Nov 23, 2010 06:19 AM | gyan prakash | LINK

use the following , may be helpful

Re: Get Username for logged in user

Nov 24, 2010 07:28 AM | NWeb | LINK

I have tried all above option with all combinations one by one and setting Anonymous user accedd to UNCHECK.

lblUserName.Text = this.Context.Request.LogonUserIdentity.Name;
lblUserName1.Text = User.Identity.Name;
lblUserName2.Text = Request.LogonUserIdentity.Name;

All this work but only problem is it asking me to login again while we access that site from sharepoint. I do not want it to ask for credentials again. Also I had observe that, If I provide credentials again then it displays the name of the user for whome we have provided credentials. So in that case some times the user actually logged in and displayed in our web part are different. Also If we do Sign In using Differernt user, the user name does not change.

Please provide any work around if you have.

Sharepoint 2007 asp.net authentication login

Re: Get Username for logged in user

Nov 24, 2010 11:00 PM | sanjibsinha | LINK

albeli

Should I have windows authentication or form authenitication turned on in the web.config file. Currently I have windows authenitcation on.

It depends on your requirements. If you build an intranet Windows Authentication is fine.

Actually this thread starts from Windows Authentication and intranet question, so I felt it would be proper this answer here.

First of all : The Windows operating system has a role system built into it. This Windows security group system is an ideal system to use when you are working with intranet-based applications where you might have all users already in defined roles. This, of course, works best if you have anonymous authentication turned off for your ASP.NET application, and you have configured your application to use Windows Authentication.

Secondly, when Windows authentication is in use, there are some limitations regarding username, Role etc. Why? Some limitations exist when using WindowsTokenRoleProvider. This is a read-only provider because ASP.NET is not allowed to modify the settings applied in the Windows security group system. This means that not all the methods provided via the RoleProvider abstract class are usable when working with this provider. From the WindowsTokenRoleProvider class, the only methods you have at your disposal are IsUserInRole and GetUsersInRole.

Thirdly, consider the authenticate mode:

Fourthly, which is what?

Windows authentication is used together with IIS authentication. Authentication is performed by IIS in the following ways: basic, digest, or Integrated Windows Authentication. When IIS authentication is complete, ASP.NET uses the authenticated identity to authorize access. This is the default setting.

On the contrary, in case of Forms authentication, Forms Requests that are not authenticated are redirected to an HTML form using HTTP client-side redirection. The user provides his login information and submits the form. If the application authenticates the request, the system issues a form that contains the credentials or a key for reacquiring the identity.

Lastly, to get back to the beginning, where this thread starts, if one uses Windows authentication for an intranet site, you need to check the IIS settings to get back Username later. So make sure your IIS authenticaton process is complete.

Пример страницы ASP.NET

В основу разработки Web-приложений на ASP.NET положена модель разделения кода представления и кода реализации, рекомендуемая Майкрософт при создании динамических документов. Страницы ASP.NET имеют расширение .aspx. Программный код может размещаться либо в отдельном файле, либо на странице внутри специального тэга для сценариев. Файл с кодом обычно имеет расширение .aspx.cs (.aspx.vb) и имя, совпадающее с именем основного ASPX файла.

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

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

Наиболее часто используется директива @ Page, с помощью которой можно задавать множество параметров:

серверный язык программирования для кода на странице;

место нахождения кода сервера (непосредственно в странице или в отдельном файле класса);

параметры отладки и трассировки.

имеет ли страница связанную главную страницу.

Если директива @ Page не включена в страницу, или если эта директива не включает определенные настройки, параметры наследуются из файла конфигурации для приложения (файл Web.config) или из файла конфигурации узла (файл Machine.config). Наиболее важные атрибуты директивы перечислены в таблице 4.1.

Атрибуты директивы @ Page

AutoEventWireup Автоматическая обработка событий страницы
Buffer Управляет буферизацией страницы. По умолчанию буферизуется
ClassName Позволяет назначать имя класса, сгенерированного данной страницей
CodeFile Название файла с отделенным кодом для данной страницы
Culture Устанавливает набор региональных параметров, т.е. язык, формат валюты, даты, чисел
Debug Если true, на страницу выводится отладочная информация
Trace Вывод трассировочной информации
EnableViewState Сохранение состояния страницы. По умолчанию она сохраняется
EnableTheming Позволяет включить или выключить поддержку тем оформления. По умолчанию включено
Inherits Класс, от которого наследуется класс данной страницы в технологии отделенного кода
IsAsync Показывает, обрабатывается ли страница асинхронно.
Language Язык, используемый во внедренном коде
WarningLevel Наибольший допустимый уровень предупреждений компилятора
CompilerOptions Опции компилятора

Кроме директивы @ Page, в текст можно включить другие директивы, которые содержат дополнительные параметры, специфичные для страницы.

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

Примечание! Для лучшего понимания сущности описываемых процессов действия по созданию файлов рекомендуется выполнять в простом редакторе (например, Блокнот).

Возьмем за основу такую статическую страницу:

Илон Маск рекомендует:  Работа с протоколом socks5 на masm
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL