2015-12-01 18 views
14

Một công ty bên ngoài đã thực hiện một số kiểm tra thâm nhập trên ứng dụng ASP.NET MVC 5 mà tôi đang thực hiện.Cookie phiên cũ không hợp lệ - Nhận dạng ASP.Net

Một vấn đề mà họ đưa ra được mô tả dưới đây

Cookie gắn với quản lý phiên được gọi AspNet.ApplicationCookie. Khi được nhập theo cách thủ công, ứng dụng sẽ xác thực người dùng. Mặc dù người dùng đăng xuất khỏi Ứng dụng, cookie vẫn hợp lệ. Điều này có nghĩa, cookie phiên cũ có thể được sử dụng để xác thực hợp lệ trong khung thời gian không giới hạn. Trong thời điểm giá trị cũ được chèn vào, ứng dụng chấp nhận nó và thay thế nó bằng một cookie mới được tạo ra. Do đó, nếu kẻ tấn công có quyền truy cập vào một trong các cookie hiện có, phiên hợp lệ sẽ được tạo, với cùng quyền truy cập như trong quá khứ.

Chúng tôi đang sử dụng ASP.NEt nhận dạng 2.2

Dưới đây là hành động logout của chúng tôi trên bộ điều khiển tài khoản

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     AuthenticationManager.SignOut(); 
     return RedirectToAction("Login", "Account"); 
    } 

trong startup.auth.cs

app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      ExpireTimeSpan = TimeSpan.FromHours(24.0), 
      Provider = new CookieAuthenticationProvider 
      { 
       // Enables the application to validate the security stamp when the user logs in. 
       // This is a security feature which is used when you change a password or add an external login to your account. 
       OnValidateIdentity = SecurityStampValidator 
      .OnValidateIdentity<ApplicationUserManager, ApplicationUser, int>(
       validateInterval: TimeSpan.FromMinutes(1.0), 
       regenerateIdentityCallback: (manager, user) => 
        user.GenerateUserIdentityAsync(manager), 
       getUserIdCallback: (id) => (Int32.Parse(id.GetUserId()))) 

      } 
     }); 

tôi sẽ phải nghĩ rằng khung công tác sẽ quan tâm đến việc vô hiệu hóa một cookie phiên cũ nhưng duyệt qua mã nguồn Owin.Security mà nó xuất hiện không.

Làm cách nào để vô hiệu hóa cookie phiên khi đăng xuất?

chỉnh sửa trên Jamie Dunstan Lời khuyên của tôi đã thêm AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); nhưng sau đó không có sự khác biệt. Tôi vẫn có thể đăng xuất khỏi ứng dụng, sao chép một yêu cầu đã được xác thực trước đó trong Fiddler và yêu cầu ứng dụng chấp nhận nó.

Chỉnh sửa: My cập nhật phương pháp Logoff

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> LogOff() 
    { 
     var user = await UserManager.FindByNameAsync(User.Identity.Name); 

     AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie); 
     await UserManager.UpdateSecurityStampAsync(user.Id); 

     return RedirectToAction("Login", "Account"); 
    } 
+0

Bạn đã thử thay thế 'AuthenticationManager.Signout();' bằng 'AuthenticationManager.Signout (DefaultAuthenticationTypes.ApplicationCookie);'? Thông báo đăng xuất không có vẻ có chút không nhất quán. –

+0

Chúc mừng. Xong, nhưng tôi vẫn có thể đăng xuất khỏi ứng dụng, và sau đó sao chép một yêu cầu đã được xác thực trước đó trong fiddler và chấp nhận nó – MrBliz

+0

Tôi cũng đã xóa Expiretimespan khỏi startup.Auth. Không khác nhau. – MrBliz

Trả lời

5

Hãy chắc chắn rằng bạn sử dụng AuthenticationManager.Signout(DefaultAuthenticationTypes.ApplicationCookie); gợi ý như một cách chính xác bởi Jamie.

Có thể đăng nhập lại với cùng một cookie đó theo thiết kế. Danh tính không tạo phiên nội bộ để theo dõi tất cả người dùng đã đăng nhập và nếu OWIN nhận cookie truy cập tất cả các hộp (tức là bản sao từ phiên trước đó), nó sẽ cho phép bạn đăng nhập.

Nếu bạn vẫn có thể đăng nhập sau khi tem bảo mật được cập nhật, rất có thể OWIN không thể giữ được số ApplicationUserManager. Hãy chắc chắn rằng bạn có dòng này ngay trên app.UseCookieAuthentication

app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 

Hoặc nếu bạn đang sử dụng DI mất ApplicationUserManager từ DI:

app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<ApplicationUserManager>()); 

Cũng giảm validateInterval: TimeSpan.FromMinutes(30) để giảm giá trị - Tôi thường giải quyết cho vài phút. Đây là tần suất Identity so sánh các giá trị trong auth-cookie với các giá trị trong cơ sở dữ liệu. Và khi so sánh được thực hiện, Identity sẽ tạo lại cookie để cập nhật dấu thời gian.

+1

Và đây là một câu hỏi khác với cùng một câu trả lời: http://stackoverflow.com/a/34016721/809357 – trailmax

+0

Cảm ơn bạn, tôi có thể xác nhận tất cả những điều trên là đúng chỗ. Tôi đã thay đổi validateInterval thành validateInterval: TimeSpan.FromMinutes (1.0). Tôi có thể thực hiện một yêu cầu tự động, đăng xuất, chờ 5 phút và sao chép yêu cầu đó và nó vẫn được xác thực. Bạn đang nói điều đó nên xảy ra bởi thiết kế? – MrBliz

+0

@MrBliz đúng - theo thiết kế. Trừ khi bạn thay đổi Security Stamp cũ cookie sẽ xác thực bạn. Tên người dùng lưu trữ cookie, userId, tem bảo mật, một số dấu thời gian và các bit thông tin khác (dưới đây là thông tin thêm một chút: http://tech.trailmax.info/2014/08/aspnet-identity-cookie-format/). Và 'SignOut()' phương pháp chỉ đơn thuần giết chết cookie. Nhưng nếu cùng một cookie được phát lại, nó sẽ chấp nhận nó. Cũng giống như cách bạn đăng xuất khỏi một trình duyệt, nhưng trình duyệt khác vẫn được xác thực. Vì vậy, nếu bạn cần phải giết tất cả các phiên, bạn cần phải cập nhật tem bảo mật cùng một lúc bạn đăng xuất. – trailmax

0

câu trả lời Trailmax là tại chỗ trên, tôi nghĩ rằng tôi muốn nói thêm rằng nếu ai đó đang cố gắng làm điều này trong khi cũng sử dụng ASP.NET Boilerplate, sau đây là những gì tôi sử dụng để làm cho công việc này:

app.CreatePerOwinContext(() => IocManager.Instance.Resolve<UserManager>());

tôi ban đầu đã có:

app.CreatePerOwinContext(() => IocManager.Instance.ResolveAsDisposable<UserManager>());

và không hoạt động.

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