NET і C#, Аутентифікація та дозволи
Якщо Web-cepвер вимагає аутентифікації користувача, можна створити посвідчення особи користувача і передати його Web-запиту. При цьому корисні такі інтерфейси та класи: ICredentials, NetworkCredential і CredentialCache.
Для автентифікації користувача створимо об'єкт типу NetworkCredential. Цей клас забезпечує інформацію з метою посвідчення особи користувача для базової аутентифікації, аутентифікації на основі дайджестів, NTLM та Kerberos.
Конструктору класуNetworkCredential можна передати ім'я користувача, пароль та додатково домен, що дозволяє доступ користувача:
Якщо потрібна різна інформація про посвідчення особи для різних URI, можна використовувати класCredentialCache, як показано в наступному коді. З таким кешем визначається тип аутентифікації для конкретного з'єднання. Тут використовується базова автентифікація для Web-сайту www.unsecure.com та аутентифікація на основі дайджестів для Web-сайту www.moresecure.com, для якого через мережу надсилається не пароль, а хеш-код:
Дозволи
Щоразу, коли використовуються мережеві класи, потрібні дозволи. Для питань мережного обміну розглянемо три типи дозволу.
Дозвіл DnsPermission потрібний для пошуку імені DNS за допомогою класу Dns. WebPermission використовується класами з простору імен System.Net, які надсилають дані до Інтернету та отримують дані за допомогою URI. SocketРеrmission використовується прийому даних на локальному сокеті чи з'єднання з хостом через транспортний протокол.
Програми, встановлені локально в системі, мають повну довіру, тому всі дозволи доступні за замовчуванням. Програми платформи. .NET також можуть запускатися із загального мережевогоресурсу, а збірки можуть завантажуватися з Інтернету - у цих ситуаціях багато дозволів недоступні за умовчанням. Отже, для цих програм потрібно конфігурувати параметри безпеки. Спочатку обговоримо програмні аспекти безпеки, після чого розглянемо як можна конфігурувати дозволи.
DnsPermission
WebPermission
WebPermission потрібен для таких класів, як WebRequest і WebResponse, щоб надсилати дані до Інтернету та отримувати їх з Інтернету.
У цьому випадку розрізняються дозволи "погодитися" (Accept) та "з'єднатися" (Connect). Дозвіл Accept потрібний для URI, що використовуються всередині класів та методів. Клієнтські програми, що використовують URI для з'єднання з сервером, потребують повноваження Connect. Клас WebPermission також має список URI, з якими можна з'єднатися, і список URI, з якими можна погодитися.
SocketPermission
Дозволи SocketРеrmission потрібні класів сокетів з простору імен System.Net.Sockets. Цей дозвіл — найгнучкіший із трьох класів мережевих дозволів.
Для серверних додатків, які чекають запити на з'єднання від клієнтів, конструктор передається значення перерахування NetworkAccess.Accept; клієнтські програми, що з'єднуються із серверами, використовують значення NetworkAccess.Connect. Можемо обмежити з'єднання конкретними хостами та номерами портів і визначити транспортний протокол, що використовується.
Використання атрибутів дозволу
Якщо потрібна роздільна здатність недоступна, програма завершується за винятком SecurityException, як тільки викликаний привілейований метод. До виключення користувач міг якийсь час працювати з додатком, і може втратити дані, якщо не обробити виняток акуратно. Гарнийспосіб, що дозволяє цього уникнути, полягає в тому, щоб відзначити складання необхідними дозволами.
Якщо для отримання даних з Інтернету використовується клас WebRequest, потрібна роздільна здатність WebPermission. Можна відзначити класи та методи, що вимагають дозволу, атрибутом WebPermission (реалізованим у класі WebPermissionAttribute) таким чином:
У разі виняток SecurityException виникає, щойно створюється екземпляр класу PermissionDemo. Якщо хочемо, щоб ця перевірка виконувалася під час старту програми, можна застосувати атрибут WebPermission до всієї збірки:
Якщо цей атрибут застосований до складання, під час старту програми середовище виконання перевіряє, чи має програма необхідний дозвіл. Якщо вона не має необхідної роздільної здатності, виконання припиняється негайно, перш ніж користувач ввів (або втратив) інформацію.
З усіма атрибутами дозволу конструктору передається значення перерахуванняSecurityAction. Тут розглянемо лише найважливіші значення перерахування:
| Demand та Deny | Значення переліку SecurityAction.Demand та SecurityAction.Deny можна використовувати з класами та методами. Значення Demand вказує, що класу або методу потрібна роздільна здатність, значення Deny визначає, що цей дозвіл не потрібний. |
| RequestMinimum, RequestOptional та RequestRefuse | Значення переліку Requestxxx можна використовувати лише в контексті складання, його не можна вказувати з класами та методами. RequestMinimum визначає, що цей дозвіл є обов'язковим для використання програми. |
Значення RequestOptional повідомляє, що програма може виконати деяку корисну роботу безцього дозволу. У цьому випадку потрібно поступово обробити виняток SecurityException.
Значення RequestRefuse визначає, що цей дозвіл не потрібен. Це значення використовується в тих випадках, коли можливе неправильне застосування дозволу, наприклад, виклик збірок, для яких у нас немає вихідних текстів і яким ми не довіряємо повністю.
З атрибутом WebPermission можна на додаток до SecurttyAction встановити такі властивості:
Accept та AcceptPattern
В якості Accept визначається URI ресурсу для використання з класом, методом або збиранням, до яких застосований цей атрибут. У властивості AcceptPattern вказується регулярне вираз, щоб дозволити чи заборонити доступ до URI.
Connect та ConnectPattern
Дві властивості ConnectXX подібні до властивостей AcceptXX, але відрізняються тим, що застосовуються для рядка з'єднання з URI.
У класі SocketPermissionAttribute визначено такі додаткові властивості:
Access
У цьому вся властивості визначається допустимий спосіб доступу до мережі. Допустимі лише два: Accept і Connect. Accept використовується для серверної програми, яка слухає та приймає з'єднання клієнтів, а значення Connect призначене для клієнта, що з'єднується з сервером.
Host
Port
Це рядкове властивість, що задає номер порту, якого потрібно дозвіл. Властивість може використовуватися обмеження додатків-клієнтів деякими конкретними серверами. Властивість має тип string, оскільки різні протоколи необов'язково визначають номер порту ціле число.
Транспорт
За допомогою властивості Transport обмежуються мережеві з'єднання конкретним транспортним протоколом. Можливі значення: All, ConnectionLess,CormectionOriented, Tcp і Udp. ConnectionLess дозволяє використовувати всі протоколи, які не потребують встановлення з'єднань, наприклад UDP; Значення ConnectionOriented дозволяє використовувати протоколи, орієнтовані встановлення з'єднання, наприклад TCP.