2014-12-25 11 views
7

Tôi có một ứng dụng ASP.NET MVC 5 sử dụng ASP.NET Identity 2.0 để xác thực người dùng.Làm thế nào để hiển thị hình ảnh xác thực sau N lần đăng nhập thất bại?

Hiện tại, người dùng buộc phải nhập hình ảnh xác thực vào mọi lần đăng nhập, nhưng nó gây ra nhiều phàn nàn về độ phức tạp của xác thực.

Mục tiêu chính là làm cho con người trở thành đăng nhập đơn giản nhất có thể, và cho một robot phức tạp nhất có thể.

Tôi quyết định hiển thị hình ảnh xác thực sau số lần cố gắng đăng nhập không thành công nhất định. Có manyalreadyaskedquestions về nó, nhưng tôi không tìm thấy câu trả lời sẽ giúp tôi xây dựng giải pháp khá hoàn chỉnh. Tôi tìm thấy điều này question về việc theo dõi không thành công, nhưng nó cũng sử dụng khóa máy, đó không phải là những gì tôi muốn. Và theo this phần trả lời của chức năng cần thiết có sẵn trong nhà cung cấp thành viên ASP.NET cũ và không có sẵn (chưa?) Trong ASP.NET Identity.

Vì vậy, tôi đã kết thúc với các thuật toán đơn giản sau đây:

  1. Nếu được cung cấp đăng nhập và mật khẩu cặp là đúng, sau đó đăng nhập người dùng trong
  2. Nếu đăng nhập hoặc mật khẩu không chính xác, sau đó ghi lại nỗ lực đăng nhập thất bại..
  3. Nếu ghi ba lần đăng nhập không thành công cho người dùng, sau đó hiển thị trang đăng nhập với hình ảnh xác thực.
  4. Nếu hình ảnh xác thực đã nhập hợp lệ, sau đó quét số lần đăng nhập không thành công, sau đó truy cập 1.
  5. Nếu captcha đã nhập không hợp lệ, hãy hiển thị lại trang đăng nhập bằng hình ảnh xác thực.

Câu hỏi đặt ra là: làm cách nào để có thể phân biệt các yêu cầu gửi đến theo yêu cầu cho thông tin đăng nhập cụ thể?

Tôi không thể dựa vào cookie, phiên, IP, v.v ... vì bất kỳ rô bốt nào cũng có thể thay đổi chúng. Và tôi cũng không thể dựa vào việc đăng nhập, vì đăng nhập có thể không tồn tại hoàn toàn. Cách tiếp cận rõ ràng là tạo một bảng riêng biệt để lưu trữ thông tin đăng nhập, số lần thử không thành công và dấu thời gian, nhưng rô bốt có thể dễ dàng tràn ngập thông tin đăng nhập giả, mặc dù tôi có thể giải quyết vấn đề này bằng cách xóa các mục cũ trong công việc được lập lịch.

Đây có phải là giải pháp hợp lệ không? Có cách nào tốt hơn để làm điều đó không?

Trả lời

4

Khuôn khổ danh tính có số lần đăng nhập không thành công cho mỗi người dùng. Bạn có thể tăng nó qua await UserManager.AccessFailedAsync(userId). Và thuộc tính ApplicationUser.AccessFailedCount lưu trữ số lượng không thành công cho hồ sơ người dùng. Và để đặt lại số cuộc gọi không thành công, hãy gọi await UserManager.ResetAccessFailedCountAsync(userId)
Vì vậy, điều này có thể được tận dụng.

Tuy nhiên điều này không được tính cho tên người dùng không hợp lệ - các lần đăng nhập mà người dùng không tồn tại trong cơ sở dữ liệu. Đối với trường hợp này, bạn có thể sử dụng bảng được đề xuất của bạn với hồ sơ thường xuyên thanh lọc qua cron-task.

Nhưng nếu người dùng cố gắng đăng nhập và đặt tên người dùng khác nhau trên mọi nỗ lực, cách tiếp cận này sẽ không thành công. Vì vậy, tôi sẽ ném vào một cookie có anyway, nhưng không dựa vào nó rất nhiều, biết rằng nó có thể bị giết dễ dàng.

Một giải pháp khác là sử dụng reCaptcha mới của Google - trên mọi trang. Tuy nhiên đây là một công nghệ mới và there are reports nó không phải là hoàn toàn đáng tin cậy.

+0

Vâng, tôi đã thấy hình ảnh xác thực mới, nhưng tôi không chắc chắn cách thức hoạt động của tính năng mới này. Dù sao, cảm ơn mẹo 'UserManager'! Tôi sẽ cố gắng kết hợp 'AccessFailedAsync' và bảng tùy chỉnh cho các thông tin đăng nhập không tồn tại và chấp nhận câu trả lời của bạn khi giải quyết một giải pháp khả thi. – sigurd

Các vấn đề liên quan