Здравствуйте, Аноним, Вы писали:
А>правильно я понимаю подход?
А>Клиент заходит на одно их приложений, получает куку, идентифицирующую его браузер, и редеректится на систему аутентификации. После аутентификации, он по гету передает полученный от системы аутентификации токен и в качестве подтверждения того, что он есть тот кто есть, прикладывает куку полученную в самом начале?
Как я и сказал, степень параноидальности выбирается по вкусу. Вот что мне пришло в голову (надеюсь вы оцените параноидальность моих мыслей

):
1. Клиент генерит случайное число и затем загоняет его к качестве seed в Random.
2. Затем, используя этот экземпляр Random, он генерит последовательность определяемого в конфиге кол-ва чисел (назовём это значение num) и берёт последнее (назовём его response).
3. seed включается в challenge-тикет при редиректе на авторизацию, полученное число response сохраняется в сессии.
4. Авторизация создаёт объект Random на основе seed, который она получила в составе тикета, и аналогичным образом получает response (серверу также должен юыть известен num). Затем он хэшируется конкатенируется со строкой параметров клиента (тут может быть IP, User Agent и т.п.), полученная строка хэшируется и добавляется в GET-запрос, с которым юзер идёт обратно на целевой сайт.
4. при возврате мы достаём из сессии наш response, собираем строку по аналогии с п.4, хэшируем её и сравниваем с тем, что пришло в GET-запросе. При совпадении считаем авторизацию успешной.
Основан метод на особенности работы ГПСЦ, коим является Random, заключающейся в том, что Random генерирует одинаковую последовательности при одинаковых seed'ах. Для иллюстрации приведу псевдокод.
Целевой сайт, перед отправкой на авторизацию:
var rand = new Random(DateTime.Now);
var seed = rand.Next();
var rand2 = new Random(seed);
var response = 0;
for(var i = 0; i < num; i++)
{
response = rand2.Next();
}
Сервер авторизации:
var rand = new Random(seed);//seed достаётся из параметров запроса
for(var i = 0; i < num; i++)
{
response = rand2.Next();
}
var identString = GenerateClientIdentString(Request); //включаем сюда всё, что по вашему мнению может идентефицировать браузер клиента
var identString += response.ToString();
var authResponse = GetMD5Hash(identString);
Целевой сайт, после возврата с авторизации:
var identString = GenerateClientIdentString(Request);
var identString += += response.ToString();
var authResponse = GetMD5Hash(identString);
//сравниваем полученных хэш с тем, что получили от авторизации, при совпадении считаем авторацию успешной
Вот как-то так. будут ещё вопросы — пишите