Работа №3. Безопасность веб-приложений
Цель работы.
Освоить методику работы с элементами и технологиями, применяемыми в ASP.NET для обеспечения безопасности веб-приложений.
Постановка задачи.
На разрабатываемом сайте должны быть реализованы следующие элементы:
1. Выделены страницы, доступные на сайте пользователям определённой роли (администраторы, редакторы и т.п.)
2. Реализованы страницы администратора для управления пользователями.
3. Предусмотрена возможность регистрации пользователей.
Registration.aspx:
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master"
AutoEventWireup="true" CodeBehind="Registration.aspx.cs" Inherits="ISP_Sem5.Registration" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<div id="content">
<div id="content_wrapper">
<div class="left">
<div id="style1_gray_border">
<asp:CreateUserWizard ID="CreateUserWizard1" runat="server" OnContinueButtonClick="CreateUserWizard1_ContinueButtonClick"
OnCreatedUser="CreateUserWizard1_CreatedUser">
<WizardSteps>
<asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server" >
</asp:CreateUserWizardStep>
<asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server">
</asp:CompleteWizardStep>
</WizardSteps>
<SideBarStyle HorizontalAlign="Center" />
</asp:CreateUserWizard>
</div>
</div>
</div>
</div>
</asp:Content>
Registration.aspx.cs:
public partial class Registration : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Control createUserStepContainer = CreateUserWizard1.FindControl("CreateUserStepContainer");
if( createUserStepContainer != null )
((TextBox)createUserStepContainer.FindControl("UserName")).MaxLength = Properties.Settings.Default.MaxUserNameLength;
}
protected void CreateUserWizard1_CreatedUser(object sender, EventArgs e)
{
Roles.AddUserToRole(CreateUserWizard1.UserName, "user");
}
protected void CreateUserWizard1_ContinueButtonClick(object sender, EventArgs e)
{
Response.Redirect("/default.aspx");
}
}
}
Работа №4. Пользовательские элементы управления
Цель работы.
Освоить базовые приёмы создания пользовательских элементов управления в ASP.NET.
Постановка задачи.
В веб-приложении нужно выделить и реализовать минимум два пользовательских элемента управления (как User Control или как Server Custom Control – на выбор). Если самостоятельно выделить пользовательские элементы не удаётся, предлагается реализовать элемент для проведения опросов (голосований) и элемент, отображающий в графическом виде результаты опроса.
ArticleView.ascx:
<%@ Control Language="C#" AutoEventWireup="true" ViewStateMode="Disabled" CodeBehind="ArticleView.ascx.cs" Inherits="ISP_Sem5.Controls.ArticleView" %>
<asp:ObjectDataSource ID="ObjectArticles" runat="server" SelectMethod="GetNewArticles"
TypeName="ISP_Sem5.BLL.Article">
</asp:ObjectDataSource>
<asp:DataList ID="ArticlesList" runat="server"
EnableTheming="true" DataSourceID="ObjectArticles" DefaultMode="ReadOnly"
GridLines="None" Width="100%" RepeatColumns="3"
onitemdatabound="ArticlesList_ItemDataBound"
ondatabinding="ArticlesList_DataBinding">
<ItemTemplate>
<table cellpadding="6" width="255px">
<tr>
<td style="width: 1px;">
<asp:Label runat="server" ID="CategoryName1" Text='<%# Eval("Title") %>' Font-Size="Medium"
Font-Bold="true" Width="200px" />
<br />
<asp:HyperLink runat="server" ID="lnkCatImage" NavigateUrl='<%# "~/ShowArticle.aspx?ID=" + Eval("ArticleID") %>'>
<div class="image_wrapper">
<asp:Image Width="250px" Height="200px" runat="server" ID="CategoryImage" BorderWidth="0px"
AlternateText='<%# Eval("Title") %>' ImageUrl='<%# Eval("TitleImageURL") %>' />
</div>
</asp:HyperLink>
<br />
<div id="alignRight">
<asp:Button ID="Button2" runat="server" SkinID="GrayButton" CommandName="Edit"
CommandArgument='<%# Eval("ArticleID") %>' Text="Edit" />
<asp:Button ID="Button1" runat="server" SkinID="GrayButton" CommandName="Delete"
CommandArgument='<%# Eval("ArticleID") %>' Text="Delete" />
</div>
</td>
</tr>
</table>
</ItemTemplate>
</asp:DataList>
ImageUploader.ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ImageUploader.ascx.cs" Inherits="ISP_Sem5.Controls.ImageUpload" %>
<asp:FileUpload ID="FileUpload" ViewStateMode="Enabled" runat="server">
</asp:FileUpload>
<asp:Button ID="btnUpload" runat="server" OnClick="btnUpload_Click" Text="Upload" CausesValidation="false" /><br />
<asp:Label ID="lblFeedbackOK" SkinID="FeedbackOK" runat="server"></asp:Label>
<asp:Label ID="lblFeedbackKO" SkinID="FeedbackKO" runat="server"></asp:Label>
Product.ascx:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>
<div class="Product">
<div class="ProductImage"><img alt="<%= Model.Name%>" src="/Content/Images/<%= Model.ImageURL%>" width="119" height="123" border="0" /></div>
<h3><%= Model.Name%></h3>
<div class="Description">
<p><span>Категория:</span> <%= Model.Category.Name%>.<br /></p>
<p><span>Страна производства:</span> <%= Model.Country.Name%>.<br /></p>
<p><span>Производитель:</span> <%= Model.Manufacturer.Name%><br /></p>
<p><span>Описание товара:</span> <br/><%= Model.Description%></p>
<p><span>В наличии:</span> <%= Model.Quantity%> единиц.</p>
<p><span>Стоимость:</span> <%= Model.Price.ToString("0.00")%>$.</p>
<%= Ajax.ActionLink("Заказать", "Order", new {ProductName = Model.Name, Price = Model.Price }, new AjaxOptions { InsertionMode = InsertionMode.InsertAfter, UpdateTargetId = "Basket" })%>
</div>
</div>
Работа №5. Разработка сайта с применением ASP.NET MVC
Цель работы:
Создать сайт, используя ASP.NET MVC.
Постановка задачи.
Необходимо создать сайт на MVC, взяв в качестве темы и основы веб-проект, созданный в предыдущих лабораторных работах. Можно использовать другую тему веб-проекта (по желанию). В данной работе необходимо продемонстрировать понимание структуры ASP.NET MVC-приложения, работу с маршрутами, контроллерами и представлениями.
Кроме этого, желательно (дополнительные баллы):
1. Реализовать работу с AJAX, используя средства ASP.NET MVC и библиотеку jQuery.
2. Продемонстрировать применение средств модульного тестирования для тестирования функционала модели и контроллеров.
Display.aspx:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>"%>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Каталог
</asp:Content>
<asp:Content ContentPlaceHolderID="SearchContentPlaceHolder" runat="server">
<div class="SearchContainer">
<% Html.BeginForm("Display", "Catalog", FormMethod.Post); %>
Поиск: <%= Html.TextBox("ProductName")%>
<% Html.EndForm();%>
</div>
</asp:Content>
<asp:Content ContentPlaceHolderID="leftPanelContentPlaceHolder" runat="server">
<div class="CategoriesMenu">
<% foreach (var Category in (List<e_shop_MVC.Models.Category>)ViewData["Categories"])
{ %>
<%= Html.ActionLink(Category.Name, "Display", new {CategoryID = Category.ID})%><br />
<%
}%>
</div>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="middlePanelContentPlaceHolder" runat="server">
<% foreach (var P in Model)
{
Html.RenderPartial("Product", (e_shop_MVC.Models.Product)P);
}%>
</asp:Content>
CatalogController.cs:
public class CatalogController : Controller
{
DataEntities Data = new DataEntities();
public ActionResult Display(short CategoryID)
{
ViewData.Model = (from P in Data.Product
where P.CategoryID == CategoryID
select P).ToList();
ViewData["Categories"] = Data.Category.ToList();
return View();
}
[HttpPost]
public ActionResult Display(string ProductName)
{
string Query = "SELECT VALUE A FROM Product AS A WHERE A.Name LIKE('%" + ProductName + "%');";
ViewData.Model = Data.CreateQuery<Product>(Query).ToList();
ViewData["Categories"] = Data.Category.ToList();
return View();
}
public string Order(string ProductName, decimal Price)
{
return ProductName + "-" + Price.ToString("0.00$") + ";<br/>";
}
protected override void Dispose(bool disposing)
{
Data.Dispose();
base.Dispose(disposing);
}
}
Работа №6. Веб-службы и WCF
Цель работы.
Ознакомится с основными приёмами создания веб-служб и технологии Windows Communication Foundation.
Постановка задачи.
Создать простую веб-службу или службу WCF для работы с данными веб-проекта. Протестировать службу, используя (на выбор) консольное приложение, WPF-приложение или небольшой вспомогательный веб-проект.
IShopService.cs:
[ServiceContract]
public interface IShopService
{
[OperationContract]
int GetProductsCount();
[OperationContract]
int GetCategoriesCount();
[OperationContract]
List<string> GetProductsNames();
[OperationContract]
List<string> GetCategoriesNames();
}
ShopService.cs:
public class MyShopService : IShopService
{
public int GetProductsCount()
{
int Count = 0;
using(var Context = new DataEntities1())
{
Count = (from P in Context.Product
select P).Count();
}
return Count;
}
public int GetCategoriesCount()
{
int Count = 0;
using (var Context = new DataEntities1())
{
Count = (from P in Context.Category
select P).Count();
}
return Count;
}
public List<string> GetProductsNames()
{
List<string> Names;
using (var Context = new DataEntities1())
{
Names = (from P in Context.Product select P.Name).ToList();
}
return Names;
}
public List<string> GetCategoriesNames()
{
List<string> Names;
using (var Context = new DataEntities1())
{
Names = (from P in Context.Category select P.Name).ToList();
}
return Names;
}
}
Работа №7. Использование AJAX
Цель работы:
Ознакомится с основными приёмами создания AJAX-приложений.
Постановка задачи.
Используя в качестве основы веб-проект, созданный в предыдущих работах, реализовать избранные функции с применением AJAX. Требуется продемонстрировать два подхода – применение стандартных компонентов AJAX и реализация AJAX-функционала «вручную», по базовым принципам этой технологии.
<script type="text/javascript">
function loadSearchResults() {
$.ajax({
url: 'Catalog/Search?ProductName=' + $('#SearchBox').val(),
success: function (result) {
$('#SearchResults').html(result);
}
});
}
</script>
public ActionResult Search(string ProductName)
{
string Query = "SELECT VALUE A FROM Product AS A WHERE A.Name LIKE('%" + ProductName + "%');";
var Products = Data.CreateQuery<Product>(Query).ToList();
return PartialView(Products);
}