WebClient和HttpWebRequest(401)未经授权 [英] WebClient and HttpWebRequest (401) Unauthorized

查看:123
本文介绍了WebClient和HttpWebRequest(401)未经授权的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

YO


当我使用method =" POST";

$时,我得到(401)未经授权


b $ b

但是当我使用method =" PUT";


时它可以工作,但是asd.php无法使用


下面的代码我尝试了两种不同的方式


 


 

 
使用系统;
使用 System.Collections.Generic;
使用 System.Linq;
使用 System.Text;
使用 System.IO;
使用 System.Net;
使用 System.Security.Cryptography.X509Certificates;
使用 System.Net.Security;
使用 System.Net.Sockets;
使用 System.Reflection;
使用 System.Collections.Specialized;

namespace SendFilesToServer
{
class 程序
{
static void Main(字符串 [] args)
{
尝试
{
doWebClientStuff( );
}
catch (例外e)
{
StreamWriter sw = new StreamWriter(File.OpenWrite(filePath));
sw.Write(e.ToString());
sw.Close();
}

}
static public void doWebClientStuff()
{
MyWebClient client = new MyWebClient() ;
string [] files = Directory.GetFiles(" files" );
SetBypassSslCertificateValidation();
client.UseDefaultCredentials = false ;
client.Credentials = new NetworkCredential(" name" "通过" );
string authInfo = " name:pass" ;
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
client.Headers [" Authorization" ] = " Basic" + authInfo;
string url = " https://ip/asd.php" ;


CookieContainer cookies = new CookieContainer();
NameValueCollection querystring = new NameValueCollection();
querystring [" uname" ] = " name" ;
querystring [" passwd" ] = " pass" ;

string text = "" ;

byte [] bytes = new 字节 [0];
foreach string uploadfile in 文件)
{
// bytes = client.UploadFile(url,uploadfile);
text = UploadFileEx (uploadfile,url," uploadedfile" " application / octet-stream" ,querystring,cookies);
break ;
}
StreamWriter sw = new StreamWriter(File.OpenWrite(filePath2));
// sw.Write(Encoding.ASCII.GetString(bytes));
sw.Write(text);
sw.Close();
client.Dispose();
}

/ *跳过认证* /
public static void SetBypassSslCertificateValidation()
{
ServicePointManager。 ServerCertificateValidationCallback
+ = new RemoteCertificateValidationCallback(BypassSslCertificateValidation);
}

private static bool BypassSslCertificateValidation( object sender,X509Certificate cert,X509Chain chain,SslPolicyErrors error)
{
< span style ="color:Blue;"> return
true ;
}

/ *不是我的* /
public static string UploadFileEx( string uploadfile, string url,
string fileFormName, string contenttype,NameValueCollection querystring,
CookieContainer cookies)
{
if ( (fileFormName == null )||
(fileFormName.Length == 0))
{
fileFormName = "文件" ;
}

if ((contenttype == null )||
(contenttype.Length == 0))
{
contenttype = " application / octet-stream" ;
}


string postdata;
postdata = "?" ;
if (querystring!= null
{
foreach string key in querystring.Keys)
{
postdata + = key + " =" + querystring.Get(key)+ "&安培;" ;
}
}
Uri uri = new Uri(url + postdata);


string boundary = " ------ ----" + DateTime.Now.Ticks.ToString(" x" );
HttpWebRequest webrequest =(HttpWebRequest)WebRequest.Create(uri);
webrequest.CookieContainer = cookies;
webrequest.ContentType = " multipart / form-data; boundary =" + boundary;
webrequest.Method = " POST" ;


//构建帖子消息标题

StringBuilder sb = new StringBuilder();
sb.Append(" - " );
sb.Append(boundary);
sb.Append(" \\\\ nn" );
sb.Append(" Content-Disposition:form-data; name = \"" );
sb.Append(fileFormName);
sb.Append(" \" ;; filename = \"" );
sb.Append(Path.GetFileName(uploadfile));
sb.Append(" \"" );
sb.Append(" \\\\ nn" );
sb.Append(" Content-Type:" );
sb.Append(contenttype);
sb.Append(" \\\\ nn" );
sb.Append(" \\\\ nn" );

string postHeader = sb.ToString();
byte [] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);

//将尾随边界字符串构建为字节数组

//确保边界单独出现在一条线上

byte [] boundaryBytes =
Encoding.ASCII.GetBytes(" \\\\ n - " + boundary + " ; \r\\\
" );

FileStream fileStream = new FileStream(uploadfile,
FileMode.Open,FileAccess.Read);
long length = postHeaderBytes.Length + fileStream.Length +
boundaryBytes.Length;
webrequest.ContentLength = length;

流requestStream = webrequest.GetRequestStream();

//写出我们的帖子标题

requestStream.Write(postHeaderBytes,0,postHeaderBytes.Length) ;

//写出文件内容

byte [] buffer = new 字节[已检查(( uint )Math.Min(4096,
int )fileStream.Length))];
int bytesRead = 0;
while ((bytesRead = fileStream.Read(buffer,0,buffer.Length))!= 0)
requestStream.Write(buffer ,0,bytesRead);

//写出尾随边界

requestStream.Write(boundaryBytes,0,boundaryBytes.Length) ;
WebResponse responce = webrequest.GetResponse();
Stream s = responce.GetResponseStream();
StreamReader sr = new StreamReader(s);

return sr.ReadToEnd();
}

}
class MyWebClient:WebClient
{
protected 覆盖 WebRequest GetWebRequest(Uri地址)
{
HttpWebRequest request =(HttpWebRequest)< span style ="color:Blue;"> base
.GetWebRequest(address);
request.ClientCertificates.Add( new X509Certificate(" certificate.crt" ));

返回请求;
}
public WebRequest asd(Uri addr)
{
return this .GetWebRequest(addr);
}
}
}

解决方案


这是事实,我建议访问以下链接:


http://support.microsoft.com/kb/907273


































扩展代码 原因 描述
401.1 登录失败 网络服务器会将此声明为"HTTP错误401.1 - 未经授权:由于凭据无效而拒绝访问"和"b
401.2 由于服务器配置登录失败 您的Web浏览器和IIS服务器无法就身份验证协议达成一致。
Web服务器将此声明为"HTTP错误401.2 - 未经授权:由于服务器配置而拒绝访问。"
401.3 由于资源上的ACL而未经授权 服务器可以对您进行身份验证,但您没有足够的权限来访问所请求的内容。

Web服务器将宣布此为"HTTP错误401.3 - 未经授权:由于在请求的资源上设置了ACL,访问被拒绝。”

另请参阅
使用Process Monitor排除HTTP 401.3错误


401.4 过滤器授权失败
401.5 ISAPI / CGI申请失败授权


YO

I get (401) Unauthorized

when i use method = "POST";

but when i use method = "PUT";

it works, but asd.php cant use that

in the code below i have tried 2 different ways

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Net.Sockets;
using System.Reflection;
using System.Collections.Specialized;

namespace SendFilesToServer
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                doWebClientStuff();
            }
            catch (Exception e)
            {
                StreamWriter sw = new StreamWriter(File.OpenWrite(filePath));
                sw.Write(e.ToString());
                sw.Close();
            }

        }
        static public void doWebClientStuff()
        {
            MyWebClient client = new MyWebClient();
            string[] files = Directory.GetFiles("files");
            SetBypassSslCertificateValidation();
            client.UseDefaultCredentials = false;
            client.Credentials = new NetworkCredential("name", "pass");
            string authInfo = "name:pass";
            authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
            client.Headers["Authorization"] = "Basic " + authInfo;
            string url = "https://ip/asd.php";


            CookieContainer cookies = new CookieContainer();
            NameValueCollection querystring = new NameValueCollection();
            querystring["uname"] = "name";
            querystring["passwd"] = "pass";

            string text = "";

            byte[] bytes = new byte[0];
            foreach (string uploadfile in files)
            {
                //bytes = client.UploadFile(url, uploadfile);
                text = UploadFileEx(uploadfile, url, "uploadedfile", "application/octet-stream", querystring, cookies);
                break;
            }
            StreamWriter sw = new StreamWriter(File.OpenWrite(filePath2));
            //sw.Write(Encoding.ASCII.GetString(bytes));
            sw.Write(text);
            sw.Close();
            client.Dispose();
        }
		
		/*skip certification*/
        public static void SetBypassSslCertificateValidation()
        {
            ServicePointManager.ServerCertificateValidationCallback
                += new RemoteCertificateValidationCallback(BypassSslCertificateValidation);
        }

        private static bool BypassSslCertificateValidation(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
        {
            return true;
        }

		/*Not mine*/
        public static string UploadFileEx(string uploadfile, string url,
    string fileFormName, string contenttype, NameValueCollection querystring,
    CookieContainer cookies)
        {
            if ((fileFormName == null) ||
                (fileFormName.Length == 0))
            {
                fileFormName = "file";
            }

            if ((contenttype == null) ||
                (contenttype.Length == 0))
            {
                contenttype = "application/octet-stream";
            }


            string postdata;
            postdata = "?";
            if (querystring != null)
            {
                foreach (string key in querystring.Keys)
                {
                    postdata += key + "=" + querystring.Get(key) + "&";
                }
            }
            Uri uri = new Uri(url + postdata);


            string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
            HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
            webrequest.CookieContainer = cookies;
            webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
            webrequest.Method = "POST";


            // Build up the post message header

            StringBuilder sb = new StringBuilder();
            sb.Append("--");
            sb.Append(boundary);
            sb.Append("\r\n");
            sb.Append("Content-Disposition: form-data; name=\"");
            sb.Append(fileFormName);
            sb.Append("\"; filename=\"");
            sb.Append(Path.GetFileName(uploadfile));
            sb.Append("\"");
            sb.Append("\r\n");
            sb.Append("Content-Type: ");
            sb.Append(contenttype);
            sb.Append("\r\n");
            sb.Append("\r\n");

            string postHeader = sb.ToString();
            byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);

            // Build the trailing boundary string as a byte array

            // ensuring the boundary appears on a line by itself

            byte[] boundaryBytes =
                   Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");

            FileStream fileStream = new FileStream(uploadfile,
                                        FileMode.Open, FileAccess.Read);
            long length = postHeaderBytes.Length + fileStream.Length +
                                                   boundaryBytes.Length;
            webrequest.ContentLength = length;

            Stream requestStream = webrequest.GetRequestStream();

            // Write out our post header

            requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);

            // Write out the file contents

            byte[] buffer = new Byte[checked((uint)Math.Min(4096,
                                     (int)fileStream.Length))];
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                requestStream.Write(buffer, 0, bytesRead);

            // Write out the trailing boundary

            requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
            WebResponse responce = webrequest.GetResponse();
            Stream s = responce.GetResponseStream();
            StreamReader sr = new StreamReader(s);

            return sr.ReadToEnd();
        }

    }
    class MyWebClient : WebClient
    {
        protected override WebRequest GetWebRequest(Uri address)
        {
            HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
            request.ClientCertificates.Add(new X509Certificate("certificate.crt"));

            return request;
        }
        public WebRequest asd(Uri addr)
        {
            return this.GetWebRequest(addr);
        }
    }
}

解决方案

Hi

This are the fact, I would suggest to visit the link below:

http://support.microsoft.com/kb/907273

Extended code Reason Description
401.1 Logon failed The web server will announce this as “HTTP Error 401.1 - Unauthorized: Access is denied due to invalid credentials”
401.2 Logon failed due to server configuration Your web browser and the IIS server could not agree on an authentication protocol
The web server will announce this as “HTTP Error 401.2 - Unauthorized: Access is denied due to server configuration.”
401.3 Unauthorized due to ACL on resource The server could authenticate you, but you do not have sufficient permission to access the content requested.
The web server will announce this as “HTTP Error 401.3 - Unauthorized: Access is denied due to an ACL set on the requested resource.”

See also Troubleshooting HTTP 401.3 errors with Process Monitor

401.4 Authorization failed by filter
401.5 Authorization failed by ISAPI/CGI application


这篇关于WebClient和HttpWebRequest(401)未经授权的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆