Работа №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>&nbsp;

<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);

}