Проверка подлинности с помощью форм на Windows Phone 7.1 (Mango)? - PullRequest
3 голосов
/ 10 ноября 2011

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

Webconfig сайтов содержит следующее:

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

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

С этим файлом 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()

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

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

1 Ответ

2 голосов
/ 13 ноября 2011

Проверьте этот класс 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)
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...