Вызов службы аутентификации ASP.NET 2.0 из не-веб-клиента - PullRequest
3 голосов
/ 12 августа 2010

Я работаю над WinNET-приложением .NET 2.0, которое вызывает веб-сайт ASP.NET 2.0.Сайт аутентифицируется с использованием форм аутентификации.Сервис аутентификации включен в web.config, и я провел эксперименты , чтобы подтвердить, что я могу получить доступ к сервису через JSON.

Вот мой вопрос: есть ли какие-то встроенныев коде для использования веб-служб System.Web.Extensions (authenticationService, profileService и т. д.) в чисто среде .NET (не ASP.NET)?Я могу найти примеры использования Silverlight и более поздних сервисов WCF, но ничего из среды 2.0 как на клиенте, так и на сервере.Добавление службы проверки подлинности в качестве веб-службы кажется логичным подходом, но я никогда не смог заставить ее работать, указывая на мой сервер разработки - я полагаю, это может быть отдельным вопросом.

Если мне нужно управлять AJAXзапрос и ответ на более низком уровне, это, безусловно, выполнимо, но если бы что-то уже было предназначено для этой цели, это, безусловно, было бы проще и менее подвержено ошибкам.

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Я так и не получил ответ на этот вопрос, но в конце концов понял это с помощью этого урока . Короткий ответ был да, мне пришлось управлять запросом / ответом AJAX на довольно низком уровне. Предполагая, что у вас есть имя пользователя и пароль, с которыми вы должны проходить аутентификацию, вы сначала должны получить для него куки-файл аутентификации. Я использовал библиотеку Json.NET от Newtonsoft для сериализации и десериализации JSON, но вы можете использовать что угодно.

Cookie GetFormAuthenticationCookie(string username, string password)
        {
            string uriString = ServerName + AUTH_SERVICE_URL;
            Uri uri = new Uri(uriString);

            // Need to cast this to HttpWebRequest to set CookieContainer property
            // With a null CookieContainer property on the request, we'd get an
            // empty HttpWebRequest.Cookies property
            HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest;
            request.Method = "POST";
            request.ContentType = "application/json; charset=utf-8";
            request.CookieContainer = new CookieContainer(); // needed to get non-empty Cookies collection back in response object

            // requestContents needs to look like this:
            // {
            //     username = 'theUserName',
            //     password = 'thePassword',
            //     createPersistentCookie = false
            // }
            string requestContents = GetJsonForLoginRequest(username, password);

            byte[] postData = Encoding.UTF8.GetBytes(requestContents);
            request.ContentLength = postData.Length;
            using (Stream dataStream = request.GetRequestStream())
            {
                dataStream.Write(postData, 0, postData.Length);
            }

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode != HttpStatusCode.OK)
            {
                throw new WebException("Response returned HttpStatusCode " + response.StatusCode);
            }

            // For now, assuming response ContentType is "application/json; charset=utf-8"
            object responseJson;
            using (Stream responseStream = response.GetResponseStream())
            {
                StreamReader reader = new StreamReader(responseStream);
                string responseString = reader.ReadToEnd();

                responseJson = JavaScriptConvert.DeserializeJson(responseString);
            }

            if (responseJson is bool)
            {
                bool authenticated = (bool)responseJson;
                if (authenticated)
                {
                    // response was "true"; return the cookie
                    return response.Cookies[".ASPXFORMSAUTH"];
                }
                else
                {
                    // apparently the login failed
                    return null;
                }
            }
            else
            {
                return null;
            }
        }

Затем добавьте cookie в последующие запросы. В моем случае это означало добавление cookie в CookieContainer прокси-сервера веб-службы, который я использовал.

0 голосов
/ 18 февраля 2012

Мне не удалось заставить работать сервис аутентификации.Я продолжал получать 404 ошибки, когда пытался вызвать Authentication_JSON_AppService.axd из моего приложения winforms.В итоге я написал свой собственный JSON-аутентификацию WebMethod.

Извините, это не C #, мой проект VB.NET.Я использовал это http://progtutorials.tripod.com/Authen.htm в качестве ссылки.

<WebMethod(EnableSession:=True)>
<ScriptMethod(ResponseFormat:=ResponseFormat.Json)>
Public Function Login(ByVal username As String, ByVal password As String) As Boolean

    Dim result As Boolean = False

    ' If (FormsAuthentication.Authenticate(username,password)) ' this may also work to authenticate
    If (Membership.ValidateUser(username, password)) Then 
        FormsAuthentication.SetAuthCookie(username, False)

        Dim ticket As FormsAuthenticationTicket = New FormsAuthenticationTicket(username, False, 30)
        Dim ticketString As String = FormsAuthentication.Encrypt(ticket)

        Dim cookie As HttpCookie = New HttpCookie(FormsAuthentication.FormsCookieName, ticketString)
        Context.Response.Cookies.Add(cookie)

        result = True

    End If

    Return result

End Function

Обязательно сделайте свой Web-сервис аутентификации доступным для анонимных пользователей в вашем файле web.config.

  <location path="Authentication.asmx">
    <system.web>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
  </location>
...