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

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

问题描述:

我在谷歌上搜索了“ASP.NET窗口应用程序的认证”,但结果是“使用ASP.NET的Windows身份验证”,这不是我正在寻找的对于。从Windows窗体应用程序的ASP.NET身份验证

场景:

我有一个ASP.NET应用程序和一组WCF服务的哪些应用程序提供的数据通过AJAX调用。这些WCF服务需要ASP.NET身份验证,这对浏览器来说很好,因为有一个cookie提供身份验证信息,或者要求用户通过登录页面进行身份验证。

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

问题:

我需要进行身份验证之前,我可以使用WCF服务,但因为这不是一个Web应用程序,没有任何的cookie,而不能显示在登录页面!

问:

我如何从Windows提供认证窗体应用程序的ASP.NET Web应用程序?

您需要为浏览器等每个请求存储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]; 
      } 
     } 
    } 
+0

不错的例子。只有缺少的东西是您的代码在cookieContainer中“修复”的错误的引用 - 只是让我们知道您实际正在处理的内容以及错误是否仍然存在。 – beterthanlife 2014-12-15 13:09:53

+0

@beterthanlife谢谢。这里是我得到这个解决方法:http://stackoverflow.com/questions/1047669/cookiecontainer-bug – 2014-12-19 01:09:23