Theo MSDN, khi thuộc tính HttpWebRequest.AllowAutoRedirect
là đúng, chuyển hướng sẽ xóa tiêu đề xác thực. Cách giải quyết nhất định là triển khai IAuthenticationModule để xử lý xác thực:Làm cách nào để xử lý xác thực bằng HttpWebRequest.AllowAutoRedirect?
Tiêu đề ủy quyền sẽ bị xóa trên tự động chuyển hướng và HttpWebRequest tự động cố gắng xác thực lại vị trí được chuyển hướng. Trong thực tế, điều này có nghĩa là ứng dụng không thể đặt thông tin xác thực tùy chỉnh vào tiêu đề Cấp quyền nếu có thể gặp phải chuyển hướng. Thay vào đó, ứng dụng phải triển khai và đăng ký một mô-đun xác thực tùy chỉnh. Các System.Net.AuthenticationManager và lớp liên quan được sử dụng để thực hiện một mô-đun xác thực tùy chỉnh. Phương thức AuthenticationManager.Register đăng ký một mô-đun xác thực tùy chỉnh.
Tôi tạo ra một thực hiện cơ bản của giao diện này:
public class CustomBasic : IAuthenticationModule
{
public CustomBasic() { }
public string AuthenticationType { get { return "Basic"; } }
public bool CanPreAuthenticate { get { return true; } }
private bool checkChallenge(string challenge, string domain)
{
if (challenge.IndexOf("Basic", StringComparison.InvariantCultureIgnoreCase) == -1) { return false; }
if (!string.IsNullOrEmpty(domain) && challenge.IndexOf(domain, StringComparison.InvariantCultureIgnoreCase) == -1) { return false; }
return true;
}
public Authorization PreAuthenticate(WebRequest request, ICredentials credentials)
{
return authenticate(request, credentials);
}
public Authorization Authenticate(String challenge, WebRequest request, ICredentials credentials)
{
if (!checkChallenge(challenge, string.Empty)) { return null; }
return this.authenticate(request, credentials);
}
private Authorization authenticate(WebRequest webRequest, ICredentials credentials)
{
NetworkCredential requestCredentials = credentials.GetCredential(webRequest.RequestUri, this.AuthenticationType);
return (new Authorization(string.Format("{0} {1}", this.AuthenticationType, Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", requestCredentials.UserName, requestCredentials.Password))))));
}
}
và một trình điều khiển đơn giản để thực hiện các chức năng:
public class Program
{
static void Main(string[] args)
{
// replaces the existing handler for Basic authentication
AuthenticationManager.Register(new CustomBasic());
// make a request that requires authentication
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://www.SomeUrlThatRequiresAuthentication.com");
request.Method = "GET";
request.KeepAlive = false;
request.ContentType = "text/plain";
request.AllowAutoRedirect = true;
request.Credentials = new NetworkCredential("userName", "password");
HttpWebResponse result = (HttpWebResponse)request.GetResponse();
}
}
Khi tôi thực hiện một yêu cầu mà không chuyển hướng, thì Phương thức Authenticate
trên lớp của tôi được gọi và xác thực thành công. Khi tôi thực hiện một yêu cầu mà reutrns một 307 (tạm thời chuyển hướng) phản ứng, không có phương pháp của lớp học của tôi được gọi là, và xác thực không thành công. Những gì đang xảy ra ở đây?
Tôi không muốn tắt tự động chuyển hướng và viết logic tùy chỉnh để tự xử lý các phản hồi 3xx. Làm thế nào tôi có thể nhận được logic xác thực của tôi để làm việc với chuyển hướng tự động?
bạn có thể thử điều này khi bạn thiết lập các keepalive trên đúng thay vì sai? Hoặc đặt URL chuyển hướng trong dòng yêu cầu? Không biết nhiều về điều này nhưng có lẽ nó sẽ giúp –
FWIW, tôi có chính xác cùng một vấn đề và tìm kiếm một giải pháp. – tomo