C# C Http基本身份验证旁路

C# C Http基本身份验证旁路,c#,httpwebrequest,basic-authentication,C#,Httpwebrequest,Basic Authentication,在C ASP.NET应用程序上,我通过HTTPWebRequest上的授权头发送用户名/密码,成功绕过了基本身份验证,最终在另一台服务器上的HttpAccess保护的目标页面上获得了解锁,即basic auth,并将流发送回浏览器 当用户单击链接时,问题就会出现,基本身份验证登录框再次弹出。我们不希望用户再次输入用户名/密码 似乎我需要在标题中返回一些内容,以告诉浏览器它用于授权的用户名/密码 我试过: 旧用户名:password@host格式不安全,不再允许在IE上使用。 HTTPWebReq

在C ASP.NET应用程序上,我通过HTTPWebRequest上的授权头发送用户名/密码,成功绕过了基本身份验证,最终在另一台服务器上的HttpAccess保护的目标页面上获得了解锁,即basic auth,并将流发送回浏览器

当用户单击链接时,问题就会出现,基本身份验证登录框再次弹出。我们不希望用户再次输入用户名/密码

似乎我需要在标题中返回一些内容,以告诉浏览器它用于授权的用户名/密码

我试过:

旧用户名:password@host格式不安全,不再允许在IE上使用。 HTTPWebRequest,它给出了前面描述的问题。 考虑事项:

正在访问的远程服务器是一个黑盒。 有没有办法做到这一点?它也可以用JavaScript完成

这是我的HttpRequest函数:

    public void DoWebRequest(String email, String psw, String hostname, 
    int port, String req_method, String webpage)
    {

    String path = hostname + ":" + port + "/" + webpage;
    String userdata = email + ":" + psw;
    System.Text.ASCIIEncoding encoding = new ASCIIEncoding();
    byte[] data = encoding.GetBytes(path);
    byte[] authBytes = Encoding.UTF8.GetBytes(userdata.ToCharArray());
    String req_short_host_temp = hostname;
    String req_short_host = req_short_host_temp.Replace("http://", "");

    Uri uri = new Uri(path);
    HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uri) as HttpWebRequest;
    req.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705;)";
    req.Method = req_method;
    req.PreAuthenticate = false;
    req.Headers["Authorization"] = "Basic " + Convert.ToBase64String(authBytes);
    req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
    req.Headers.Add("Accept-Language: en-us,en;q=0.5");
    req.Headers.Add("Accept-Encoding: gzip,deflate");
    req.Headers.Add("Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7");
    req.KeepAlive = true;
    req.Headers.Add("Keep-Alive: 1000");
    req.ReadWriteTimeout = 320000;
    req.Timeout = 320000;
    req.Host = req_short_host;
    req.AllowAutoRedirect = true;

    req.ContentType = "application/x-www-form-urlencoded";
    req.Headers.GetType().InvokeMember("ChangeInternal", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, req.Headers, new object[] { "Host", req_short_host });

    var headers = new MyHeaderCollection();
    req.Headers = headers;
    headers.Set("Host", req_short_host);

    StreamWriter sw = new StreamWriter(req.GetRequestStream());
    sw.Write("/" + "?user=" + email + "&password=" + psw);
    sw.Close();

    HttpWebResponse response = (HttpWebResponse)req.GetResponse();
    StreamReader reader = new StreamReader(response.GetResponseStream());
    string tmp = reader.ReadToEnd();

    foreach (Cookie cook in response.Cookies)
    {
        tmp += "\n" + cook.Name + ": " + cook.Value;
    }

    Response.Write(tmp);
    Response.End();

}

我不知道javascript,但我相信在c中是没有办法做到这一点的。您可以过滤所有用户交互,这样浏览器就不会直接访问其他服务器。要做到这一点,请重写内容中的所有URL以指向脚本反向代理。

我不知道javascript,但我相信在c中没有办法做到这一点。您可以过滤所有用户交互,这样浏览器就不会直接访问其他服务器。为此,请重写内容中的所有URL以指向脚本反向代理。

谢谢,我想我在一次测试中用了两种方法尝试了此选项。第一个测试:我在目标位置编辑了html,因此每个链接都指向整个目标位置路径,例如,对于我放置的原始/Frame.htm,但当用户单击该链接时,仍然会显示登录屏幕。第二个测试:我还尝试用发送请求的地址chesms.com.ar替换这些链接,但这会在发送请求的服务器中出现404错误,这是不正确的。谢谢,我想我在一次测试中尝试了两种方法。第一个测试:我在目标位置编辑了html,因此每个链接都指向整个目标位置路径,例如,对于我放置的原始/Frame.htm,但当用户单击该链接时,仍然会显示登录屏幕。第二个测试:我还尝试用发送请求的地址chesms.com.ar替换这些链接,但这会在发送请求的服务器中产生404错误,这是不正确的。您知道实现这一点的方法吗?我试过使用cookie,但它在html中无法持久。你知道实现这一点的方法吗?我尝试过使用cookie,但它在html中无法持久。