Windows窗体应用程序中的ASP.NET身份验证

时间:2013-03-05 09:00:09

标签: c# asp.net .net wcf authentication

我在google上搜索过“ ASP.NET窗体应用程序中的ASP.NET身份验证”,但结果是“使用ASP.NET进行Windows身份验证”,这不是我想要的。

情境:

我有一个ASP.NET应用程序和一组WCF服务,它们通过AJAX调用向应用程序提供数据。这些WCF服务需要ASP.NET身份验证,这可以在浏览器中使用,因为有一个cookie可以提供身份验证信息,或者要求用户通过登录页面进行身份验证。

我需要从Windows窗体应用程序调用这些服务,而不改变它们的工作方式。即Windows窗体应用程序将从服务接收JSON数据并进行处理。

问题:

我需要在使用WCF服务之前进行身份验证,但由于这不是Web应用程序,因此没有cookie,并且无法显示登录页面!

问题:

如何从Windows窗体应用程序向ASP.NET Web应用程序提供身份验证?

1 个答案:

答案 0 :(得分:5)

您需要为浏览器等每个请求存储Cookie。一旦发送了登录表单请求,cookie变量就会让您对下一个请求进行身份验证。

static class Requester
{
    static CookieContainer cookieJar = new CookieContainer();
    static string userAgent = ""; //specify your user agent

    /// <summary>
    /// Static method to request a web page. 
    /// It acts like a browser which means that keeps all cookies for depending domain.
    /// </summary>
    /// <param name="URL"></param>
    /// <returns></returns>
    static public FinalResponse sendRequest(string URL)
    {
        return sendRequest(URL, "");
    }


    static public FinalResponse sendRequest(string URL, string parameters)
    {
        FinalResponse result = new FinalResponse();
        Stopwatch timer = new Stopwatch();
        HttpWebRequest request;

        try
        {
            request = (HttpWebRequest)HttpWebRequest.Create(URL);
            request.Referer = "http://google.com"; //specify your referer
            request.CookieContainer = cookieJar;
            request.UserAgent = userAgent;
            BugFix_CookieDomain();
            request.AllowAutoRedirect = true;
            if (parameters != "")
            {
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = parameters.Length;

                //push parameters to request stream
                StreamWriter myWriter = new StreamWriter(request.GetRequestStream());
                myWriter.Write(parameters);
                myWriter.Close();
            }
            //send request
            result.requestTime = DateTime.Now;
            timer.Start();
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            timer.Stop();
            result.responseMilliseconds = timer.ElapsedMilliseconds;
            BugFix_CookieDomain();
            using (StreamReader sr = new StreamReader(response.GetResponseStream()))
            {
                result.document = sr.ReadToEnd();
                sr.Close();
                result.isSucceded = true;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            result.document = "";
            result.isSucceded = false;
        }
        return result;
    }


    /// <summary>
    /// Call this function before all usage of cookieJar. 
    /// It fixes the bug (!) of CookieContainer Class. 
    /// </summary>
    private static void BugFix_CookieDomain()
    {
        System.Type _ContainerType = typeof(CookieContainer);
        Hashtable table = (Hashtable)_ContainerType.InvokeMember("m_domainTable",
                                   System.Reflection.BindingFlags.NonPublic |
                                   System.Reflection.BindingFlags.GetField |
                                   System.Reflection.BindingFlags.Instance,
                                   null,
                                   cookieJar,
                                   new object[] { });
        ArrayList keys = new ArrayList(table.Keys);
        foreach (string keyObj in keys)
        {
            string key = (keyObj as string);
            if (key[0] == '.')
            {
                string newKey = key.Remove(0, 1);
                table[newKey] = table[keyObj];
            }
        }
    }