2012-03-26 35 views
6

chúng tôi có vấn đề cụ thể với mã thông báo chống giả mạo trên trang đăng nhập. Nếu người dùng đăng nhập chỉ với một cửa sổ đang hoạt động, mọi thứ sẽ hoạt động tốt nếu người dùng mở trang đăng nhập trong hai cửa sổ và nhật ký khác nhau từ cửa sổ A (không có vấn đề gì), và quay lại đăng nhập từ cửa sổ B trong cửa sổ này người dùng sẽ nhận được "Mã thông báo chống giả mạo không được cung cấp hoặc không hợp lệ".Mvc3 Mã thông báo chống đa phương tiện mã thông báo nhiều tab

Có cách nào khác để loại bỏ mã thông báo chống giả mạo khỏi hành động xem/bộ điều khiển không? Chúng tôi muốn có mã thông báo để bảo mật thêm!

này rất giống với câu hỏi này tuy nhiên điều này được hỏi cho mvc2 MVC ValidateAntiForgeryToken multi-tabs problem

+0

Tôi đã để lại cho bạn câu trả lời khác - tôi nên đã trả lời câu hỏi của riêng tôi! –

Trả lời

20

Hành vi này trong MVC3 hoặc MVC4 được thiết kế tuy nhiên không thân thiện với người dùng như đã giải thích ở trên, tuy nhiên trong quá trình sản xuất, vấn đề này cần được giải quyết một cách duyên dáng và ứng dụng cần xử lý tình huống kỳ lạ này. Giải pháp cho vấn đề này là tạo bộ lọc được áp dụng cho bài đăng đăng nhập để xác minh xem người dùng có đăng nhập hay không và đưa họ đến đúng trang nếu không họ sẽ vẫn ở trang đăng nhập.

Dưới đây là đoạn code cho bộ lọc thuộc tính

/// <summary> 
/// Handle Antiforgery token exception and redirect to customer area if the user is Authenticated 
/// </summary> 
public class RedirectOnError : HandleErrorAttribute 
{ 
    /// <summary> 
    /// Override the on exception method and check if the user is authenticated and redirect the user 
    /// to the customer service index otherwise continue with the base implamentation 
    /// </summary> 
    /// <param name="filterContext">Current Exception Context of the request</param> 
    public override void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext.Exception is HttpAntiForgeryException && filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      // Set response code back to normal 
      filterContext.HttpContext.Response.StatusCode = 200; 

      // Handle the exception 
      filterContext.ExceptionHandled = true; 

      UrlHelper urlH = new UrlHelper(filterContext.HttpContext.Request.RequestContext); 

      // Create a new request context 
      RequestContext rc = new RequestContext(filterContext.HttpContext, filterContext.RouteData); 

      // Create a new return url 
      string url = RouteTable.Routes.GetVirtualPath(rc, new RouteValueDictionary(new { Controller = "CustomerArea", action = "Index" })).VirtualPath; 

      // Check if there is a request url 
      if (filterContext.HttpContext.Request.Params["ReturnUrl"] != null && urlH.IsLocalUrl(filterContext.HttpContext.Request.Params["ReturnUrl"])) 
      { 
       url = filterContext.HttpContext.Request.Params["ReturnUrl"]; 
      } 

      // Redirect the user back to the customer service index page 
      filterContext.HttpContext.Response.Redirect(url, true); 
     } 
     else 
     { 
      // Continue to the base 
      base.OnException(filterContext); 
     } 
    } 
} 

Đây là ví dụ về việc sử dụng

 [HttpPost] 
     **[RedirectOnError]** 
     [ValidateAntiForgeryToken] 
     public ActionResult LogOn(LogOnViewModel model, UserSessionState session, string returnUrl) 
     { 
     ..... 
     } 
+0

Tôi không hiểu điều gì sẽ xảy ra nếu người dùng không đăng nhập ... vì còn lại trên trang đăng nhập có thể dẫn đến ngoại lệ một lần nữa. – ilans

+2

Để phản hồi lại IlanS - mã nếu (filterContext.Exception là HttpAntiForgeryException && filterContext.HttpContext.User.Identity.IsAuthenticated) sẽ chỉ áp dụng chuyển hướng nếu người dùng đăng nhập, nếu không ngoại lệ thông thường cho người dùng không được xác thực là ném. – MORCHARD

+0

Giải pháp tuyệt vời! –

4

Khi bạn đăng nhập, tất cả các thẻ trước đó là không hợp lệ. Đó là cách nó phải làm việc. Naz nhận được câu trả lời đúng, ngoại trừ mã thông báo trong cookie không lưu trữ tên người dùng. Chỉ có mã thông báo trong biểu mẫu. Chính vì vấn đề này: nếu người dùng đăng nhập, tất cả các mã thông báo hiện tại sẽ bị vô hiệu, nhưng việc vô hiệu hóa chính cookie sẽ quá khó hiểu và không thân thiện với người dùng.

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