2008-12-08 34 views
21

Tôi đang sử dụng tư cách thành viên ASP.NET để xác thực ứng dụng web của mình. Nó hiệu quả tuyệt vời đối với tôi. Bây giờ tôi phải thực hiện hết hạn mật khẩu.Hạn sử dụng mật khẩu thành viên ASP.NET

Nếu mật khẩu đã hết hạn, người dùng sẽ được chuyển hướng đến màn hình ChangePassword và không được phép truy cập vào bất kỳ phần nào khác của ứng dụng mà không thay đổi mật khẩu.

Có nhiều trang aspx. Một giải pháp có thể là chuyển hướng đến màn hình ChangePasswordOnInit của mọi aspx nếu mật khẩu đã hết hạn. Có bất kỳ giải pháp hoặc đề xuất nào khác không.

Cảm ơn, Jai

Trả lời

13

Bạn có thể thêm một event handler cho sự kiện HttpApplication.PostAuthenticateRequest trong global.asax và xử lý chuyển hướng đó.

+6

Đó là những gì tôi làm, kết hợp với việc sử dụng thuộc tính LastPasswordChangedDate của Nhà cung cấp thành viên để xác định thời điểm hết hạn. – technophile

6

Chỉ cần triển khai trong khoảng một giờ, không cần sửa đổi trang cơ sở của bạn. Heres những gì bạn phải làm:

  1. Respond to sự kiện LoggingIn của điều khiển thành viên

  2. Tìm người dùng trong cơ sở dữ liệu thành viên và nhận được LastPasswordChangedDate

  3. Sử dụng một TimeSpan, so sánh điều này với ngày hiện tại và quyết định xem mật khẩu được thay đổi lần cuối nhiều hơn số ngày cần thiết của ngày trước. Tôi nhận được giá trị này từ web.config

  4. Nếu hết hạn, chuyển hướng đến màn hình ChangePassword

+1

Điều này sẽ không bắt người dùng có vé auth hiện tại ("nhớ tôi"). Giải pháp của csgero là chính xác. – Brett

+0

Có, nếu chúng hiện đang được xác thực, tôi sẽ nói rằng đây không phải là vấn đề lớn, trừ khi bạn làm cho cookie của bạn hợp lệ đến vô cùng. Có lẽ nếu bạn phát hiện ra rằng họ đã đăng nhập và hết hạn, thì chỉ cần đặt cookie hết hạn sau 20 phút hoặc lâu hơn, mỗi lần. Sau đó, khi họ trở lại, họ sẽ phải thay đổi nó. –

+1

Vấn đề với việc kiểm tra trong PostAuth cũng là một tấn hoạt động hệ thống bổ sung cho mỗi yêu cầu duy nhất. Miễn là vé của bạn hết hạn thường xuyên không có nhiều vấn đề, HOẶC bạn chỉ cần chạy mã PostAuth cho +1 ngày ngoài thời gian chờ của bạn. Điều này đảm bảo bất kỳ ai truy cập trang web với một biểu mẫu xác thực hợp lệ đều được kiểm tra. Sau đó, nếu họ không đăng nhập ở tất cả trong thời gian đó, các hình thức auth vé hết hạn và LogginIn thậm chí có thể được sử dụng. Sau 1 ngày ngoài thời gian hết hạn vé, bạn có thể xóa sự kiện PostAuth. Ngoài ra, bạn sẽ muốn kiểm tra khi đăng nhập –

26

Tiếp tục để csgero's answer, tôi thấy rằng bạn không cần phải thêm một cách rõ ràng một event handler cho sự kiện này trong ASP.Net 2.0 (3.5).

Bạn có thể dễ dàng tạo ra các phương pháp sau đây trong global.asax và nó được dây lên cho bạn:

void Application_PostAuthenticateRequest(object sender, EventArgs e) 
{ 
    if (this.User.Identity.IsAuthenticated) 
    { 
     // get user 
     MembershipUser user = Membership.GetUser(); 

     // has their password expired? 
     if (user != null 
      && user.LastPasswordChangedDate.Date.AddDays(90) < DateTime.Now.Date 
      && !Request.Path.EndsWith("/Account/ChangePassword.aspx")) 
     { 
      Server.Transfer("~/ChangePassword.aspx"); 
     } 
    } 
} 
+1

Câu trả lời tuyệt vời và mã ví dụ. Cảm ơn! – joshschreuder

+0

Xin lưu ý sửa chữa của Ben Rethmeier dưới đây (http://stackoverflow.com/a/9879682/324817) để có thể thay đổi mật khẩu trên màn hình thay đổi mật khẩu. – joshschreuder

+0

Cảm ơn @shrodes - Tôi đã cập nhật câu trả lời của tôi để bao gồm sửa chữa của Ben Rethmeier: o) – Andrew

9

Tiếp tục để Andrew's answer, tôi thấy bạn cần phải kiểm tra mà người dùng không phải là đã có trên trang thay đổi mật khẩu, hoặc họ sẽ không bao giờ có thể thực sự thay đổi mật khẩu của họ, và do đó không bao giờ rời khỏi trang web thay đổi mật khẩu:

void Application_PostAuthenticateRequest(object sender, EventArgs e) 
    { 
     if (this.User.Identity.IsAuthenticated) 
     { 
      // get user 
      MembershipUser user = Membership.GetUser(); 

      // has their password expired? 
      if (user != null 
       && user.LastPasswordChangedDate.AddMinutes(30) < DateTime.Now 
       && !Request.Path.EndsWith("/Account/ChangePassword.aspx")) 
      { 
       Server.Transfer("~/Account/ChangePassword.aspx"); 
      } 
     } 
    } 
+0

+1: điểm tốt Ben: o) – Andrew

4

tôi đã ở đây tìm kiếm một giải pháp cho điều này, nhưng công nghệ hiện tại của tôi là ASP.NET MVC. Vì vậy, để giúp đỡ người khác: bạn có thể kéo dài tuổi AuthorizeAttribute, và ghi đè OnAuthorization phương pháp, như thế này:

public class ExpiredPasswordAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     IPrincipal user = filterContext.HttpContext.User; 

     if(user != null && user.Identity.IsAuthenticated) 
     { 
      MembershipUser membershipUser = Membership.GetUser(); 

      if (PasswordExpired) // Your logic to check if password is expired... 
      { 
       filterContext.HttpContext.Response.Redirect(
        string.Format("~/{0}/{1}?{2}", MVC.SGAccount.Name, MVC.SGAccount.ActionNames.ChangePassword, 
        "reason=expired")); 

      } 
     } 

     base.OnAuthorization(filterContext); 
    } 
} 

Lưu ý: Tôi sử dụng T4MVC để lấy Controller và Tên hành động trong đoạn code trên.

Đánh dấu tất cả bộ điều khiển có thuộc tính này ngoại trừ "AccountController". Làm như vậy, không người dùng nào có mật khẩu đã hết hạn sẽ có thể lướt trang web.

Dưới đây là một bài tôi đã làm về đề tài này với một số điểm thưởng:

User Password Expired filter attribute in ASP.NET MVC

0

tôi đã sử dụng mã từ trên cao và chỉ có chút thay đổi nó để thực hiện trong Asp.NET (4.5) MVC5 sử dụng. Nhà cung cấp nhận dạng NET. Chỉ cần để nó ở đây cho anh chàng/cô gái tiếp theo :)

void Application_PostAuthenticateRequest(object sender, EventArgs e) 
    { 
     if (this.User.Identity.IsAuthenticated) 
     { 
      WisewomanDBContext db = new WisewomanDBContext(); 

      // get user 
      var userId = User.Identity.GetUserId(); 
      ApplicationUser user = db.Users.Find(userId); 

      // has their password expired? 
      if (user != null && user.PasswordExpires <= DateTime.Now.Date 
       && !Request.Path.EndsWith("/Manage/ChangePassword")) 
      { 
       Response.Redirect("~/Manage/ChangePassword"); 
      } 

      db.Dispose(); 
     } 
    } 
Các vấn đề liên quan