Thử cài đặt (trong toàn cầu.cs):
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;
này sẽ bổ sung các định danh tên vào mã thông báo của bạn,
Đối với các vấn đề đăng nhập đôi cố gắng sử dụng một kịch bản để ghi lại ngày và thời gian của bản gốc nộp để ngăn chặn một trình thứ hai với cùng một mã thông báo.
// jQuery plugin to prevent double submission of forms
jQuery.fn.preventDoubleSubmission = function() {
$(this).on('submit',function(e){
var $form = $(this);
if ($form.data('submitted') === true) {
// Previously submitted - don't submit again
e.preventDefault();
} else {
// Mark it so that the next submit can be ignored
$form.data('submitted', true);
}
});
// Keep chainability
return this;
};
Vì vậy, chúng tôi biết một điều; người dùng thích nút quay lại và có thói quen nhấp đúp, đây là vấn đề lớn với AntiforgeryToken.
Nhưng tùy thuộc vào ứng dụng của bạn có những cách nào để hạn chế buộc phải làm như vậy. Cách đơn giản nhất là cố gắng hết sức để làm cho khách truy cập không cảm thấy họ cần phải “tua lại” yêu cầu của họ để thay đổi nó.
Đảm bảo rằng thông báo lỗi biểu mẫu rõ ràng và súc tích để đảm bảo người dùng biết điều gì là sai. Lỗi theo ngữ cảnh cho điểm thưởng.
Luôn duy trì trạng thái biểu mẫu giữa các lần gửi biểu mẫu. Ngoài số điện thoại mật khẩu hoặc số thẻ tín dụng, không có lý do gì để cảm ơn người giúp việc mẫu MVC . @Html.LabelFor(x => x.FirstName)
Nếu hình thức được lan truyền trên các tab hoặc divs ẩn như những người sử dụng trong khuôn khổ SPA như kiễu góc hoặc ember.js, hãy thông minh và hiển thị các bố trí điều khiển hoặc hình rằng lỗi thực sự có nguồn gốc từ trong nộp mẫu đơn khi hiển thị lỗi. Không chỉ hướng họ tới bộ điều khiển chính hoặc tab đầu tiên.
“Những gì đang xảy ra?” - Giữ người dùng thông báo
Khi một AntiForgeryToken không xác nhận trang web của bạn sẽ ném một ngoại lệ kiểu System.Web.Mvc.HttpAntiForgeryException.
Nếu bạn đã thiết lập chính xác bạn đã gặp lỗi thân thiện và điều này có nghĩa là trang lỗi của bạn sẽ không hiển thị Ngoại lệ và hiển thị trang lỗi đẹp cho biết điều gì đang xảy ra.
Bạn có thể làm điều này dễ dàng hơn một chút bằng cách ít nhất là cung cấp cho người dùng một trang thông tin hơn được nhắm mục tiêu tại các ngoại lệ này bằng cách bắt HttpAntiForgeryException.
private void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (ex is HttpAntiForgeryException)
{
Response.Clear();
Server.ClearError(); //make sure you log the exception first
Response.Redirect("/error/antiforgery", true);
}
}
và /error/antiforgery
xem của bạn có thể nói với họ Xin lỗi bạn đã cố gắng gửi thông tin cùng một hai lần
Idea khác là để ghi lại các lỗi và trả lại người dùng đến màn hình đăng nhập:
Tạo một lớp HandleAntiforgeryTokenErrorAttribute
ghi đè phương thức OnException.
HandleAntiforgeryTokenErrorAttribute.cs:
public class HandleAntiforgeryTokenErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary(new { action = "Login", controller = "Account" }));
}
}
toàn cầu Lọc:
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new HandleAntiforgeryTokenErrorAttribute()
{ ExceptionType = typeof(HttpAntiForgeryException) }
);
}
}
Tôi cũng sẽ sử dụng một vài công cụ để ghi lại tất cả thông tin của bạn như đăng nhập là một phần quan trọng của ứng dụng của bạn
NLog cho khai thác gỗ nói chung và email về ngoại lệ ứng dụng quan trọng (bao gồm ngoại lệ trên web).
Elmah để lọc và email ngoại lệ web.
CHỈNH SỬA: Ngoài ra, bạn có thể muốn xem một plugin jQuery có tên là SafeForm. Link
EDIT:
Tôi đã thấy phân bổ cho các cuộc tranh luận về vấn đề này và quan điểm của mọi người về đề tài này có điểm hợp lệ, Làm thế nào tôi nhìn vào nó được (Trích từ owasp.org)
chéo Giả mạo yêu cầu trang web (CSRF) là một cuộc tấn công buộc người dùng cuối thực thi các hành động không mong muốn trên ứng dụng web trong đó họ đang hiện được xác thực, các cuộc tấn công CSRF nhắm mục tiêu cụ thể g yêu cầu, không bị đánh cắp dữ liệu. Mã thông báo chống giả mạo là dành riêng cho 'người đã đăng nhập'. Vì vậy, một khi bạn đăng nhập, sau đó quay trở lại, các thẻ cũ không còn giá trị
Bây giờ tôi cũng sử dụng địa chỉ IP có thẩm quyền để đăng nhập vào phân phối các ứng dụng của tôi với 2 phép nhân tố nếu người sử dụng địa chỉ IP thay đổi, vì vậy nếu Yêu cầu qua trang web giả mạo đã được thực hiện khi người dùng không khớp với địa chỉ IP và yêu cầu ủy quyền 2 yếu tố. gần giống như cách một bộ định tuyến bảo mật hoạt động. nhưng nếu bạn muốn giữ nó trên trang đăng nhập của bạn, tôi không thấy một vấn đề miễn là bạn có các trang lỗi thân thiện của bạn thiết lập mọi người sẽ không nhận được khó chịu vì họ sẽ thấy họ đã làm điều gì đó sai trái.
Bạn có thể sử dụng tập lệnh để tắt gửi hai lần, http://stackoverflow.com/questions/2830542/prevent-double-submission-of-forms-in-jquery –
Xin chào, tôi cũng gặp vấn đề tương tự khi người dùng nhấn nút quay lại trên trình duyệt. Bạn đã kết thúc bằng cái gì? – VAAA
@VAAA: Xem phần EDIT của câu hỏi của tôi - vì chỉ có biểu mẫu đăng nhập đã cho chúng tôi vấn đề này, cuối cùng, chúng tôi vừa tắt xác thực mã thông báo ở đó. Chúng tôi quyết định đơn giản là không đáng để giải quyết rắc rối và thẳng thắn, tôi không thể tìm thấy giải pháp 'sạch' nào - chỉ có một số cách giải quyết xấu (giống như giải pháp mà tôi đã đăng với bản thử). – user2384366