从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];
}
}
}
不错的例子。只有缺少的东西是您的代码在cookieContainer中“修复”的错误的引用 - 只是让我们知道您实际正在处理的内容以及错误是否仍然存在。 – beterthanlife 2014-12-15 13:09:53
@beterthanlife谢谢。这里是我得到这个解决方法:http://stackoverflow.com/questions/1047669/cookiecontainer-bug – 2014-12-19 01:09:23