Gần đây, khi thực hiện một dự án cho công ty, khách hàng có nhu cầu chúng tôi thường xuyên lấy dữ liệu từ hệ thống ma trận của họ. Khi giao tiếp với khách hàng, người ta đề cập rằng giao diện của họ sử dụng chứng chỉ BASIC, chứng chỉ này hiện không được sử dụng phổ biến. Ôi chúa ơi, nó rất không an toàn và dễ bị theo dõi bởi những kẻ bất hợp pháp. Tại sao bạn vẫn sử dụng nó? Nhưng không có cách nào, ai lại để hệ thống của khách hàng như thế này? Bởi vì hầu hết sự phát triển hiện nay đều dựa trên xác thực Bearer.
1. Nghiên cứu
1. Xác thực cơ bản đã được đề xuất trong HTTP 1.0. Đây là một phương thức xác thực HTTP tương đối đơn giản. Máy khách truyền tên người dùng và mật khẩu đến máy chủ để xác thực thông qua văn bản thuần túy (định dạng mã hóa Base64) để đảm bảo. sự an toàn của việc truyền tải thông tin.
3. Nếu không được xác thực, máy chủ sẽ trả về 401 UNAUTHORIZED cho máy khách; nếu máy khách là trình duyệt, một hộp thoại sẽ bật lên sau khi nhận được 401 để hỏi tên người dùng và mật khẩu. 4. Tên người dùng và mật khẩu đã nhập. mật khẩu sẽ theo tên người dùng: mật khẩu Sau khi định dạng được ghép, hãy sử dụng mã hóa base64 và điền vào trường Ủy quyền trong tiêu đề của thông báo yêu cầu, chẳng hạn như Basic bWFyczpsb28=. Nếu nhập sai tên người dùng và mật khẩu, máy chủ sẽ liên tục nhắc tên người dùng và mật khẩu cho đến khi nhập đúng hoặc người dùng nhấp vào nút Hủy để từ bỏ xác thực. Nếu nhập đúng tên người dùng và mật khẩu, trình duyệt sẽ quay lại trang sau khi xác thực. 5. Vì bản thân mã hóa base64 là một quá trình có thể đảo ngược nên nếu người trung gian chặn tin nhắn thì có thể nhận được ủy quyền chính xác thông qua một cuộc tấn công phát lại.
2. Một ví dụ về C#
bước một
/// /// Phương thức gọi cuối cùng /// /// Điều kiện truy vấn /// Truy cập URL địa chỉ /// Tên người dùng /// Mật khẩu /// Nhiệm vụ không đồng bộ công khai < chuỗi> Basic_PostAsync(chuỗi param,string urlAddress,string userName,string userPassword) { string replyString = string.Empty; try { // Tạo đối tượng HttpWebRequest HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(urlAddress); thông số}"); //_logger.Warn($"Địa chỉ hệ thống ma trận: {_options.UrlAddress}"); // Đặt phương thức gọi bài đăng httpRequest.Method = "Post"; // Đặt kiểu truyền tham số httpRequest.ContentType = " application/json ; charset=utf-8";//"application/x-www-form-urlencoded;charset=utf-8";;;;application/json // Đặt chuỗi tiêu đề yêu cầu cho xác thực Http Basic base64 = GetEncodedCredentials(userName, userPassword); httpRequest.Headers.Add("Authorization", "Basic " + base64); //byte chuyển đổi định dạng tham số truyền [] bytesRequestData = Encoding.UTF8. GetBytes(param); //_logger.Warn($"Chuyển đổi định dạng dữ liệu tham số đầu vào: {bytesRequestData}"); httpRequest.ContentLength = bytesRequestData.Length; Luồng postStream = chờ đợi httpRequest.GetRequestStreamAsync(); postStream.Write(bytesRequestData, 0, bytesRequestData.Length); //Nhận và đặt thời gian chờ xác thực và yêu cầu SetWebRequest(httpRequest); ); // HttpWebRequest bắt đầu cuộc gọi bằng cách sử dụng (HttpWebResponse myResponse = (HttpWebResponse)httpRequest.GetResponse()) { // Đối tượng StreamReader StreamReader sr = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8); // Trả về kết quả replyString = sr.ReadToEnd(); _logger.Warn($"Gọi hệ thống ma trận để trả về kết quả: {responseString}"); return replyString } } Catch (Exception ex) { //Trả về thông báo lỗi replyString = ex.ToString() } return replyString }
Bước 2
/// /// Chuyển đổi chuỗi /// /// /// /// / chuỗi riêng tư GetEncodedCredentials(string userName, string passName) { string mergeCredentials = string.Format("{0}:{1}", userName, passName byte[] byteCredentials = UTF8Encoding.UTF8.GetBytes(mergedCredentials); trả về Convert.ToBase64String(byteCredentials);
Bước 3
/// /// Nhận và đặt xác thực danh tính và hết thời gian chờ yêu cầu /// /// Private static void SetWebRequest(HttpWebRequest request) { request . Thông tin xác thực = CredentialCache.DefaultCredentials request.Timeout = 1000000 }
Cuối cùng, bài viết về một ví dụ C# dựa trên Basicauth kết thúc tại đây. Nếu bạn muốn biết thêm về một ví dụ C# dựa trên Basicauth, vui lòng tìm kiếm bài viết CFSDN hoặc tiếp tục duyệt qua các bài viết liên quan. Tôi hy vọng bạn sẽ hỗ trợ tôi trong tương lai. blog! .
Tôi là một lập trình viên xuất sắc, rất giỏi!