기본 인증을 사용하는 HttpWebRequest


139

이 동작을 위해 IIS를 설정할 때 사용했던 "기본 인증 요청"을 모방하는 인증 요청을하려고합니다.

URL은 https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2
(경고 : https!)입니다.

이 서버는 UNIX 및 Java에서 애플리케이션 서버로 실행 중입니다.

이 서버에 연결하는 데 사용하는 코드는 다음과 같습니다.

CookieContainer myContainer = new CookieContainer();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2");
request.Credentials = new NetworkCredential(xxx,xxx);
request.CookieContainer = myContainer;
request.PreAuthenticate = true;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

(이 사이트의 다른 게시물에서 이것을 복사했습니다). 그러나 서버 에서이 답변을받습니다.

기본 연결이 닫혔습니다. 전송 중에 예기치 않은 오류가 발생했습니다.

C #에 대한 지식이 제공해야 할 모든 가능한 작업을 시도했지만 아무것도 ...


추가 한 경우이 것이 효과가 있다고 생각합니다. request.UseDefaultCredentials = false;
bpeikes

답변:


277

인증 헤더를 직접 추가 할 수도 있습니다.

"Authorization"이라는 이름과 "Basic BASE64 ({USERNAME : PASSWORD})"값을 지정하십시오.

String username = "abc";
String password = "123";
String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));
httpWebRequest.Headers.Add("Authorization", "Basic " + encoded);

편집하다

HTTP 기본 인증에 어떤 인코딩을 사용해야합니까?에 따라 인코딩을 UTF-8에서 ISO 8859-1로 전환했습니다 . 그리고 Jeroen의 의견.


3
UTF8이 사용하기에 적합한 인코딩인지 어떻게 알 수 있습니까?
Jeroen Wiert Pluimers

2
잘 잡았다. 요청 인증 헤더는 ISO-8859-1로 인코딩되어야합니다. 당 stackoverflow.com/questions/7242316/...
Zambonilli

1
아아아 아아아! 1 : 감사합니다, 친구. 2. CredentialCache에서 인증 방법을 설정 한 다른 방법이 전혀 작동하지 않는 이유를 정말로 알고 싶습니다. 그들은 그렇지 않습니까?
mshthn

1
모든 msdn 설명서는 예를 가리키며 다른 방법은 작동합니다. 그러나 나는 그들이 일을 할 수 없었습니다.
Zambonilli

나를 위해 일하지 않습니다 (utf-8도 ISO-8859-1도 아닙니다). 어떤 제안을 확인해야합니까? "webRequest.Credentials = new NetworkCredential (UserID, Password);"를 수행하면 작동합니다. .
RollerCosta 2016 년

56

나는 마침내 그것을 얻었다!

string url = @"https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2";
WebRequest request = WebRequest.Create(url);
request.Credentials = GetCredential();
request.PreAuthenticate = true;

그리고 이건 GetCredential()

private CredentialCache GetCredential()
{
    string url = @"https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2";
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
    CredentialCache credentialCache = new CredentialCache();
    credentialCache.Add(new System.Uri(url), "Basic", new NetworkCredential(ConfigurationManager.AppSettings["ead_username"], ConfigurationManager.AppSettings["ead_password"]));
    return credentialCache;
}

예!


29

WebClient클래스 를 사용할 수 있으면 기본 인증 사용이 간단 해집니다.

var client = new WebClient {Credentials = new NetworkCredential("user_name", "password")};
var response = client.DownloadString("https://telematicoprova.agenziadogane.it/TelematicoServiziDiUtilitaWeb/ServiziDiUtilitaAutServlet?UC=22&SC=1&ST=2");

8

이 시도:

System.Net.CredentialCache credentialCache = new System.Net.CredentialCache(); 
credentialCache.Add(
    new System.Uri("http://www.yoururl.com/"),
    "Basic", 
    new System.Net.NetworkCredential("username", "password")
);

...
...

httpWebRequest.Credentials = credentialCache; 

확실히 기본 인증입니까? 또한 브라우저를 통해 사용자 이름 / 암호로 리소스에 액세스 할 수 있습니까?
MrEyes

https를 통한 기본 인증 인 것 같습니다. 내가 제공 한 링크를 클릭하면 IIS에서 "기본 인증"을 수행하거나 아파치를 통해 폴더에 .htaccss 파일을 사용할 때와 마찬가지로 브라우저가 사용자 이름 / 암호 요청을 팝업으로 표시합니다. 난에 대한 단서가 없다.
케니 Rullo

방금 웹 사이트가 IBM http 서버에서 실행되고 있음을 알게되었습니다. 이것은 유용한 뉴스가 될 수 있습니까?
Kenny Rullo

5

사용하는 사람들을 위해 RestSharp를 사용하는 경우, 그것은 실패 할 수 있습니다 SimpleAuthenticator를 (아마도 인해 ISO-8859-1 장면 뒤에 사용하지 않도록). 기본 인증 헤더를 명시 적으로 보내서 처리했습니다.

string username = "...";
string password = "...";

public IRestResponse GetResponse(string url, Method method = Method.GET)
{
    string encoded = Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes($"{username}:{password}"));
    var client = new RestClient(url);
    var request = new RestRequest(method );
    request.AddHeader("Authorization", $"Basic {encoded}");
    IRestResponse response = client.Execute(request);
    return response;
}

var response = GetResponse(url);
txtResult.Text = response.Content;

3

다음 코드는 기본 인증 및 프록시가 구현 된 경우 json 응답을 해결하고 IIS 7.5 호스팅 문제를 해결합니다.

public string HttpGetByWebRequ(string uri, string username, string password)
{
//For Basic Authentication
    string authInfo = username + ":" + password;
    authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));

//For Proxy
    WebProxy proxy = new WebProxy("http://10.127.0.1:8080", true);

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    request.Method = "GET";
    request.Accept = "application/json; charset=utf-8";
    request.Proxy = proxy;

    request.Headers["Authorization"] = "Basic " + authInfo;

    var response = (HttpWebResponse)request.GetResponse();

    string strResponse = "";
    using (var sr = new StreamReader(response.GetResponseStream()))
    {
        strResponse= sr.ReadToEnd();

    }

    return strResponse;
}

나를 위해 작동하지 않습니다 (utf-8 또는 ISO-8859-1 또는 기본값 모두). 어떤 제안을 확인해야합니까? 참고- "webRequest.Credentials = new NetworkCredential (UserID, Password);"
RollerCosta 2016 년


1

다음 구성이 제대로 작동하지 않았습니다.

request.Credentials = new NetworkCredential("user", "pass");

CredentialCache대신 사용 했습니다.

CredentialCache credentialCache = new CredentialCache
{
    {
        new Uri($"http://{request.Host}/"), "Basic",
        new NetworkCredential("user", "pass")
    }
};
request.Credentials = credentialCache;

그러나 여러 기본 인증 자격 증명을 추가하려는 경우 (예 : 알고있는 리디렉션이있는 경우) 내가 만든 다음 기능을 사용할 수 있습니다.

private void SetNetworkCredential(Uri uriPrefix, string authType, NetworkCredential credential)
{
    if (request.Credentials == null)
    {
        request.Credentials = new CredentialCache();
    }

    if (request.Credentials.GetCredential(uriPrefix, authType) == null)
    {
        (request.Credentials as CredentialCache).Add(uriPrefix, authType, credential);
    }
}

앞으로 누군가에게 도움이 되길 바랍니다.


0

우선, ServicePointManager.SecurityProtocol = SecurityProtocolType입니다. Tls12Ssl3 대신 작동했습니다.

둘째, 기본 인증 요청을 일부 데이터 (양식으로 코딩)와 함께 보내야했습니다. 다음은 많은 솔루션을 시도한 후 완벽하게 작동 한 완벽한 샘플입니다.

면책 조항 : 아래 코드는 유용한 정보 덕분 에이 링크와 다른 스택 오버 플로우 링크에서 발견 된 솔루션의 혼합입니다.

        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
        String username = "user_name";
        String password = "password";
        String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));

        //Form Data
        var formData = "var1=val1&var2=val2";
        var encodedFormData = Encoding.ASCII.GetBytes(formData);

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("THE_URL");
        request.ContentType = "application/x-www-form-urlencoded";
        request.Method = "POST";
        request.ContentLength = encodedFormData.Length;
        request.Headers.Add("Authorization", "Basic " + encoded);
        request.PreAuthenticate = true;

        using (var stream = request.GetRequestStream())
        {
            stream.Write(encodedFormData, 0, encodedFormData.Length);
        }

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.