Handcode Аутентифікація

Аутентифікація. WCF

Спочатку створимо звичайний WCF сервіс без аутентифікації, для цього відкриємо VisualStudio і додамо в Solution новий проект для WCF сервісу - AuthWCF. У створений проект додамо інтерфейс ISecretService:

public interface ISecretService

Далі реалізуємо цей інтерфейс у WCF сервісі:

Public class SecretService : ISecretService

public string GetSecretCode()

Поки нічого складно, метод GetSecretCode можуть викликати будь-які користувачі. Але ми хочемо, щоб цей метод могли викликати лише відомі нам користувачі, тому розпочнемо реалізацію процесу аутентифікації.

Перше з чим варто визначитися це з Security Mode: Transport, Message або TransportWithMessageCredential. Вибираємо тип безпеки на рівні повідомлень – Message. Друге, це видом аутентифікації клієнта Client Credential Type залежно від розташування WCF сервісу (internet, intranet): Windows, Certificate, Digest, Basic, UserName, NTLM, IssuedToken. Вибираємо автентифікацію за логіном та паролем - UserName, як найбільш універсальний тип.

Визначившись зі зв'язкою Message/UserName, налаштуємо WCF сервіс, додавши до конфігураційного файлу (Web.config) рядка:

У налаштуваннях ми вказали існуючий CustomUserNameValidator, тому додамо в проект клас CustomUserNameValidator, який є спадкоємцем UserNamePasswordValidator, і реалізує процес аутентифікації користувача:

public class CustomUserNameValidator : UserNamePasswordValidator

public override void Validate( string userName, string password)

// Доступ дозволено лише користувачеві "ilya" за паролем "pass"

if (!(userName == "ilya" && password == "pass" ))

throw new FaultException ( "Невірнийлогін або пароль"));

#FindKey.exe My LocalMachine

cacls.exe "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" /E /G "ASPNET":R

Деxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxім'я файлу з private-ключом.

Серверна сторона налаштована, залишилося розібратися із клієнтською. Створимо новий консольний проект, в якому додамо "Service Reference" на наш WCF-сервіс (http://localhost/authwcf/). Файл WCF проксі та конфігураційний файл згенеруються автоматично. Після цього, можна викликати сервіс методів, попередньо передавши ClientCredentials:

using (SecretService. SecretServiceClient srv = new SecretService. SecretServiceClient())

Якщо заглянути в конфігураційний файл клієнта, ви побачите розділ, який містить сертифікат сервісу, збереженому у форматі Base64:

Можна налаштувати аутентифікацію, на основі довіри CA сертифікату (важливо про відзначити, в такому випадку, клієнт повинен довіряти CA, який видав сертифікат для нашого сервісу. Ця проблема вирішується шляхом додавання CA сертифіката в довірені центри сертифікації поточного клієнта), для цього треба додати наступні рядки до конфігураційного файлу клієнта:

Якщо у Вас виник виняток ("X.509 certificate CN=localhost, OU=IT Department, O=MyCompany, S=Russia, C=RU chain building failed. Certificate that was used has a trust функція відкликання не змогла провести перевірку відкликання для сертифіката."), то швидше за все Ви не додали список відкликаних сертифікатів для CA в сховище з попередньої "статті".

На стороні WCF сервісу, можна дізнатися, хто аутентифікувався в даній сесії через властивість:

String login = ServiceSecurityContext .Current.PrimaryIdentity.Name;

Дякуємо за статтю, особливо за роботу із сертифікатами. Робота з ними часом не така очевидна. MS самі кажуть, що WCF Security одна з найбільш складних речей. можливості при Message Security використовувати Streamed режим).

Але може це окремі випадки звичайно))

@Bon Так, треба щоб клієнт довіряв кореневому сертифікату. До речі, якщо Ви використовуєте IIS7, то там налаштування безпеки на основі сертифікатів спрощене.

Так, я використовую IIS7, але особливих зручностей не помітив, якщо можна докладніше.