Опубликован: 08.07.2011 | Уровень: для всех | Доступ: платный
Самостоятельная работа 3:

Разработка бизнес приложения Silverlight

< Лекция 8 || Самостоятельная работа 3: 12345 || Дополнительный материал 1 >

Задание 5. Реализовать валидацию данных – 2 часа

Для валидации на сервере используются атрибуты метаданных объектов из пространства имен System.ComponentModel.DataAnnotations. Для валидации по умолчанию используются следующие атрибуты:

  • DataTypeAttribute – определяет тип для проверяемого свойства;
  • RangeAttribute – фиксирует диапазон возможных значений;
  • RegularExpressionAttribute – задает регулярное выражение для строковых данных;
  • RequiredAttribute – определяет обязательность свойства при вводе;
  • StringLengthAttribute – задает длину строки.

Валидацию свойства FirstName сущности Employee проведем для выполнения следующих условий:

  • вводимое имя может содержать только строчные и прописные буквы русского алфавита и символ пробела, для всех 20-ти возможных для ввода символов. При нарушении этого условия необходимо вывести сообщение "Недопустимые символы или более 20 символов";
  • свойство FirstName является обязательным для ввода и при нарушении этого условия вывести сообщение "Поле обязательно должно быть заполнено".

Фрагмент кода класса EmployeeMetadata в части описания свойства FirstName приведен ниже.

[Display(Name = "Имя", Order = 2)]
[RegularExpression((@"^[А-Яа-я' ']{1,20}$"),
                             ErrorMessage = "Недопустимые символы или более 20 символов")]
[Required(ErrorMessage = "Поле обязательно должно быть заполнено")]
public string FirstName { get; set; }

Аналогичные атрибуты установим в классе EmployeeMetadata для свойств LastName, SecondName и для свойства Role, за исключением атрибута [ Required ].

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

[Display(Name = "Эл. почта", Order = 7)]
[RegularExpression("^([\\w-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|" + 
" (([\\w-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$", 
ErrorMessageResourceName = "ValidationErrorInvalidEmail", 
ErrorMessageResourceType = typeof(ValidationErrorResources))]
public string Email { get; set; }

Для свойства Inn определим допустимость ввода только цифровых символов, которых может быть 12.

[Display(Name = "ИНН", Order = 6)]
[RegularExpression((@"^[0-9]{1,12}$"), 
ErrorMessage = "Допустимы толька цифровые символы, длина ИНН - 12 символов")]
[CustomValidation(typeof(ValidaterInn), "ValidateInn")]
public string Inn { get; set; }

Для свойства Inn применен атрибут CustomValidation, который позволяет задать пользовательское правило проверки. В параметрах атрибута CustomValidation определен класс ValidaterInn, определяющий правило проверки, и метод проверки – ValidateInn. Класс ValidaterInn создадим в папке Models/ Shared проекта EnterpriceBusinessApplication.Web.

public class ValidaterInn
{
    public static ValidationResult ValidateInn(string Inn)
    {
        ValidationResult res;
        if (Inn.Length == 12)
        {
            res = ValidationResult.Success;
        }
        else
        {
            res = new ValidationResult("ИНН должен содержать 12 символов");
        }
        return res;
    }
}

Статический метод ValidateInn возвращает экземпляр класса ValidationResult, который является контейнером результатов запроса на проверку данных. Если проверка проведена успешно, то возвращается поле ValidationResult.Success, определяющее успешное завершение проверки, в противном случае, создается новый экземпляр класса ValidationResult, которому в конструкторе передается строка, с информацией об ошибке. Класс ValidaterInn создан в проекте EnterpriceBusinessApplication.Web и для того, чтобы он был доступен на клиенте приложения его нужно сделать общедоступным, для чего необходимо переименовать файл класса, добавив к имени .shared, то есть ValidaterInn.shared.cs.

Задание 6. Настроить аутентификацию и авторизацию пользователей – 2 часа

Windows-авторизация. Для настройки Windows- авторизации в проекте EnterpriceBusinessApplication.Web для файла Web.config необходимо свойству mode объекта authentication установить значение Windows.

<authentication mode="Windows"/ >

В клиентском проекте EnterpriceBusinessApplication в конструкторе класса App для свойства аутентификации Authentication веб конекста webContext присвоить значение вновь созданного экземпляра класса Windows аутентификации – WindowsAuthentication.

public App()
{
	InitializeComponent();
	WebContext webContext = new WebContext();
	webContext.Authentication = new WindowsAuthentication();
	this.ApplicationLifetimeObjects.Add(webContext);
}

После загрузки приложения происходит автоматически Windows-авторизация пользователя ( рис. 11.24).

Windows-авторизация

увеличить изображение
Рис. 11.24. Windows-авторизация

Пользовательская авторизация. Для аутентификации зарегистрированных в приложении пользователей в проекте EnterpriceBusinessApplication.Web для файла Web.config необходимо свойству mode объекта authentication установить значение Forms и задать имя формы.

<authentication mode="Forms">
      <forms name=".EnterpriceBusinessApplication_ASPXAUTH" />
</authentication>

В конструкторе клиентского класса App следует для свойства аутентификации Authentication веб контекста webContext создать экземпляр класса пользовательской авторизации FormsAuthentication.

public App()
{
	InitializeComponent();
	WebContext webContext = new WebContext();
	webContext.Authentication = new FormsAuthentication();
	this.ApplicationLifetimeObjects.Add(webContext);
}

Нового пользователя при открытии приложения необходимо зарегистрировать ( рис. 11.25). Зарегистрированный пользователь должен пройти аутентификацию ( рис. 11.26). Если аутентификация прошла успешно, то на странице приложения выводится имя пользователя, работающего с приложением ( рис. 11.27).

Регистрация нового пользователя

увеличить изображение
Рис. 11.25. Регистрация нового пользователя
Аутентификация пользователя

увеличить изображение
Рис. 11.26. Аутентификация пользователя
Вход в приложение зарегистрированного пользователя

увеличить изображение
Рис. 11.27. Вход в приложение зарегистрированного пользователя

Если имя пользователя или пароль введены с ошибкой, то аутентификация пользователя не проходит ( рис. 11.28).

Отказ в аутентификации пользователя

увеличить изображение
Рис. 11.28. Отказ в аутентификации пользователя

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

Аутентификация осуществляется на этапе регистрации пользователя, а авторизация реализуется на базе аутентификации с применением механизма ролей.

Для создания ролей необходимо настроить конфигурацию ASP.NET приложения. Для проекта EnterpriceBusinessApplication.Web приложения необходимо в меню Проект выбрать пункт Конфигурация ASP.NET ( рис. 11.29).

Выбор настройки конфигурации ASP.NET

увеличить изображение
Рис. 11.29. Выбор настройки конфигурации ASP.NET

На странице администрирования веб-узла ( рис. 11.30) следует открыть вкладку Безопасность ( рис. 11.31).

Страница администрирования веб-узла

увеличить изображение
Рис. 11.30. Страница администрирования веб-узла
Вкладка безопасность страницы администрирования веб-узла

увеличить изображение
Рис. 11.31. Вкладка безопасность страницы администрирования веб-узла

Выбрав ссылку "Создание ролей и управления ими" перейдем на страницу, где создадим две новые роли: администратор и оператор ( рис. 11.32).

Создание ролей приложения

увеличить изображение
Рис. 11.32. Создание ролей приложения

Для создания новых пользователей выберем ссылку "Создать пользователя" и создадим два новых пользователя – одного с ролью Администратор, а другого – "Оператор" ( рис. 11.33).

Создание нового пользователя с заданием роли

увеличить изображение
Рис. 11.33. Создание нового пользователя с заданием роли

На странице администрирования веб-узла предоставляются возможности создания и управления пользователями, ролями и правилами доступа.

Для разграничения прав доступа различных пользователей к приложению используются атрибуты для классов и методов службы домена. Если ставится задача ограничить доступ к таблице Employee только зарегистрированным пользователям, метод загрузки данных GetEmployees() для этой таблицы класса EmployeeDomainService должен быть отмечен атрибутом RequiresAuthentication().

[RequiresAuthentication()]
public IQueryable<Employee> GetEmployees()

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

[RequiresRole("администратор")]
public void InsertEmployee(Employee employee)
    { . . . }

[RequiresRole("администратор")]
public void UpdateEmployee(Employee currentEmployee)
        { . . . }

[RequiresRole("администратор")]
public void DeleteEmployee(Employee employee)
        { . . . }

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

< Лекция 8 || Самостоятельная работа 3: 12345 || Дополнительный материал 1 >
Александр Петров
Александр Петров

При загрузке данных из БД возникает исключение InvalidOperationException с сообщением: Элемент коллекции должен быть пустым перед использованием ItemsSource. Знаю, что для заполнения DataGrid можно использовать коллекции Items или ItemsSource, но одновременно их использовать нельзя: если задано значение для свойства ItemsSource и в коде C# добавляется элемент в Items, возникает исключение. 
Вопрос, как отследить и отключить добавление элемента в Items?

Максим Спиридонов
Максим Спиридонов

В пятой лекции на второй странице в компиляторе выскакивает ошибка в строчке :

ObjectQuery<Employee> employees = DataEntitiesEmployee.Employees;

Ошибка CS0029

Не удается неявно преобразовать тип "System.Data.Entity.DbSet<WpfApplProject.Employee>" в "System.Data.Entity.Core.Objects.ObjectQuery<WpfApplProject.Employee>".

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

Igor Chelyadinski
Igor Chelyadinski
Беларусь, Минск, №54, 2013
Валентина Алешина
Валентина Алешина
Россия