Службы RIA, проверка подлинности с помощью форм и дополнительные файлы cookie - PullRequest
2 голосов
/ 21 февраля 2011

У меня есть приложение Silverlight 4 RIA Services с настраиваемой проверкой подлинности с помощью форм. Пользовательская служба аутентификации работает как шарм.

Проблема в том, что я хочу сериализовать объект пользователя в файле cookie, который затем отправляется с каждым последующим запросом.

Я создаю файл cookie и добавляю его в коллекцию файлов ответов, но по следующему запросу единственными файлами cookie в коллекции файлов cookie являются ASPXAUT и ASPX_SESSIONId, а пользовательский файл cookie не является следом.

Это класс управления файлами cookie:

public class CookieManager:ISessionManager
{

    public object this[string key]
    {
        get
        {
            var context = getCurrentContext();
            var cookie = context.Request.Cookies[key];
            if (cookie == null) return null;
            return deserialize(cookie.Value);
        }
        set
        {
            var context = getCurrentContext();
            string cookieValue = serialize(value);

            HttpCookie cookie = new HttpCookie(key, cookieValue);
            cookie.Expires = DateTime.Now.AddDays(10000);
            cookie.HttpOnly = false;

            context.Response.Cookies.Remove(key);
            context.Response.Cookies.Add(cookie);
        }
    }

    public void Abandon()
    {
        var context = getCurrentContext();
        context.Response.Cookies.Clear();
    }

    public void Clear()
    {
        Abandon();
    }

    private HttpContext getCurrentContext()
    {
        return HttpContext.Current;
    }

    private string serialize(object value)
    {
        MemoryStream stream = new MemoryStream();

        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Context = new StreamingContext(StreamingContextStates.Clone);
        formatter.Serialize(stream, value);

        StreamReader reader = new StreamReader(stream);
        stream.Position = 0;

        string result = reader.ReadToEnd();
        reader.Close();
        stream.Close();

        return HttpUtility.UrlEncodeUnicode(result);
    }

    public object deserialize(string value)
    {
        value = HttpUtility.UrlDecode(value);

        MemoryStream stream = new MemoryStream();
        StreamWriter writer = new StreamWriter(stream);
        writer.Write(value);

        BinaryFormatter formatter = new BinaryFormatter();
        return formatter.Deserialize(stream);


    }

}

Читает и сохраняет куки.

Теперь моя проблема такова:

  1. Что мне нужно включить в Silverlight или в приложении ASP.NET (WCF) для отправки дополнительных куки-файлов с каждым запросом вместе с куки-файлом аутентификации.

EDIT:

Я проверил стек запросов / ответов HTTP, и эти дополнительные файлы cookie отправляются с сервера вместе с ответом служб RIA WCF, но не возвращаются при следующем вызове службы от клиента.

1 Ответ

2 голосов
/ 25 февраля 2011

Если я правильно понимаю ваши изменения, указанные выше, вы уже проверили запросы HTTP и обнаружили, что требуемый файл cookie присутствует в заголовке HTTP Set-Cookie ответа, но отсутствует в заголовке Cookie следующего запроса.Это правильно?Если нет, пожалуйста, уточните.

Если это так, проблема звучит как одна из трех:

  1. клиент не может успешно сохранить cookie, по многим возможным причинам, включая:
    • cookieнеправильно отформатирован (unlikley)
    • файл cookie слишком длинный
    • существует политика на стороне клиента или сервера (например, P3P), запрещающая сохранение постоянных файлов cookie.
  2. Клиент сохраняет cookie в порядке, но не отправляет его обратно, даже без Silverlight.Это может быть вызвано, например, проблемой безопасности, когда имя хоста первого запроса отличается от второго.
  3. Клиент сохраняет cookie и может отправить его обратно через обычные HTML-страницы, но не через HTTP-запросы, отправленные Silverlight.

Чтобы узнать, является ли проблема № 1, посмотрите(используя возможности браузера для просмотра файлов cookie) в файлах cookie, сохраненных вашим браузером для этого сайта.Ожидаемый файл cookie сохранен?Если это так, то вы можете устранить # 1 в качестве проблемы.Если он не сохранен, начните искать

Чтобы увидеть, является ли проблема № 2, попробуйте создать страницу на стороне сервера без серебряного света - просто простую страницу HTML.Когда вы посещаете эту страницу с помощью браузера, отправляются ли файлы cookie, как ожидается?Если да, то # 2 не ваша проблема.

Если № 1 и № 2 не проблема, то остается № 3.Обработка HTTP в Silverlight является сложной, не в последнюю очередь потому, что вам приходится выбирать между обработкой клиентских запросов HTTP браузером или Silverlight.Внимательно прочитайте документацию к cookie-файлам Silverlight и посмотрите, поможет ли какая-либо информация в ней помочь вам разобраться в проблеме.Попробуйте использовать настройку «Client HTTP» или, если вы уже используете ее, подумайте о том, чтобы вернуться к настройке «HTTP браузера» и посмотреть, исчезнет ли ваша проблема.Обратите внимание, что настройка HTTP-клиента, по-видимому, связана с потерей новых файлов cookie после перенаправления HTTP.См. эту тему для получения дополнительной информации.В этой теме обсуждается обходной путь: используя CookieContainer.

Кстати, не могли бы вы отредактировать свой вопрос, включив в него все заголовки HTTP запроса и последующего запроса?Это может помочь диагностике.

...