我在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应用程序提供身份验证?
答案 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];
}
}
}