Основываясь на отзывах других ответов на этот вопрос, дополнительных исследованиях и дискуссиях в автономном режиме, вот что мы в итоге сделали ...
Довольно быстро было отмечено, что модель взаимодействия здесь по существу точно такая же, как и модель, используемая для проверки подлинности с помощью форм в ASP.NET, когда установлен флажок «запомнить меня». Это просто не веб-браузер, делающий HTTP-запросы. Наш «билет» эквивалентен cookie-файлу, который устанавливает Аутентификация с помощью форм. Аутентификация с помощью форм по умолчанию использует подход «шифровать некоторые данные с помощью секретного ключа» по умолчанию.
В нашем веб-сервисе для входа в систему мы используем этот код для создания заявки:
string[] userData = new string[4];
// fill the userData array with the information we need for subsequent requests
userData[0] = ...; // data we need
userData[1] = ...; // other data, etc
// create a Forms Auth ticket with the username and the user data.
FormsAuthenticationTicket formsTicket = new FormsAuthenticationTicket(
1,
username,
DateTime.Now,
DateTime.Now.AddMinutes(DefaultTimeout),
true,
string.Join(UserDataDelimiter, userData)
);
// encrypt the ticket
string encryptedTicket = FormsAuthentication.Encrypt(formsTicket);
Затем у нас есть атрибут поведения операции для служб WCF, который добавляет IParameterInspector, который проверяет действительный билет в заголовках HTTP для запроса. Разработчики помещают этот атрибут поведения операции в операции, требующие аутентификации. Вот как этот код анализирует билет:
// get the Forms Auth ticket object back from the encrypted Ticket
FormsAuthenticationTicket formsTicket = FormsAuthentication.Decrypt(encryptedTicket);
// split the user data back apart
string[] userData = formsTicket.UserData.Split(new string[] { UserDataDelimiter }, StringSplitOptions.None);
// verify that the username in the ticket matches the username that was sent with the request
if (formsTicket.Name == expectedUsername)
{
// ticket is valid
...
}