Формирует аутентификацию на Windows Phone 7.1 (Mango)?

#asp.net #asp.net-membership #forms-authentication #windows-phone-7.1 #windows-phone-7

#asp.net #asp.net-членство #формы-проверка подлинности #windows-phone-7.1 #windows-phone-7

Вопрос:

Я пытаюсь войти на свой веб-сайт Works с помощью эмулятора WP7 (Mango), используя проверку подлинности forms. (В конечном итоге создайте приложение WP7, которое позволит вам просматривать некоторые вещи на этом сайте)

webconfig сайтов содержит это:

   <system.web.extensions>
<scripting>
    <webServices>
        <authenticationService enabled="true" requireSSL="false"/>
    </webServices> 
</scripting>
  

У них есть пример кода, который в основном входит в систему, вызывая службу аутентификации ODataService, передавая пользователя / pass и получая обратно файл cookie аутентификации.

С помощью этого файла cookie все новые запросы включают его в ODataService и должны иметь возможность извлекать данные.

Перед отправкой любых запросов — получите файл cookie для проверки подлинности

 private static string GetAuthenticationCookie(string username, string password)
    {
        if (authenticationCookie == null)
        {
            string loginServiceAddress = websiteUrl   "/Authentication_JSON_AppService.axd/Login";

            var request = CreateAuthenticationRequest(username, password, loginServiceAddress);

            var response = request.GetResponse();
            if (response.Headers["Set-Cookie"] != null)
            {
                authenticationCookie = response.Headers["Set-Cookie"];
            }
            else
            {
                throw new SecurityException("Invalid credentials");
            }
        }

        return authenticationCookie;
    }       

private static WebRequest CreateAuthenticationRequest(string username, string password, string loginServiceAddress)
    {
        var request = HttpWebRequest.Create(loginServiceAddress);

        request.Method = "POST";
        request.ContentType = "application/json";
        var body = string.Format(
            "{{ "userName": "{0}", "password": "{1}", "createPersistentCookie":false}}",
            username,
            password);
        request.ContentLength = body.Length;

        var stream = request.GetRequestStream();
        using (var sw = new StreamWriter(stream))
        {
            sw.Write(body);
        }

        return request;
    }
  

Я не могу просто скопировать-вставить этот код в приложение Windows Phone 7.1 (Mango), поскольку сетевой код немного отличается — например .. все выполняется асинхронно в WP7 и что-то вроде

 myWebRequest.GetResponse()
  

больше не работает .. и я должен сделать что-то вроде

 myWebRequest.BeginGetResponse()
  

Если у кого-нибудь есть какие-либо рабочие примеры кода, которые аутентифицируют с использованием forms auth в WP7 — это было бы здорово

Большое спасибо

Ответ №1:

Проверьте этот класс http:

http://mytoolkit.codeplex.com/wikipage?title=Http

Следующий код должен сделать свое дело:

 private void OnButtonClick(object sender, RoutedEventArgs e)
{
    const string username = "user";
    const string password = "password";
    const string loginServiceAddress = "http://www.server.com/Services/AuthenticationService.svc";

    var text = string.Format("{{ "userName": "{0}", "password": "{1}", "createPersistentCookie":false}}", 
        username, password);

    var request = new HttpPostRequest(loginServiceAddress);
    request.RawData = Encoding.UTF8.GetBytes(text);
    request.ContentType = "application/json";
    Http.Post(request, AuthenticationCompleted);
}

private void AuthenticationCompleted(HttpResponse authResponse)
{
    const string serviceAddress = "http://www.server.com";
    if (authResponse.Successful)
    {
        var sessionCookie = authResponse.Cookies.Single(c => c.Name == "SessionId");
        var request = new HttpGetRequest(serviceAddress);
        request.Cookies.Add(new Cookie("SessionId", sessionCookie.Value));
        Http.Get(request, OperationCallCompleted);
    }
}

private void OperationCallCompleted(HttpResponse response)
{
    if (response.Successful)
    {
        // TODO: do your parsing
        var responseText = response.Response;

        Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            // TODO: set data to binding or directly to user control (in UI thread)
        });
    }
}
  

Комментарии:

1. Я не могу использовать код, ошибки компиляции — похоже, что в некоторых классах отсутствуют HttpUtilityExtensions — я попытаюсь обойти это, хотя

2. Извините, HttpUtilityExtensions можно найти здесь: mytoolkit.svn.codeplex.com/svn/Utilities /…

3. Редактировать: mytoolkit.svn.codeplex.com/svn/Shared/Utilities/…