2009-05-07 23 views
6

Tôi cần chuyển hướng người dùng đến trang Thay đổi mật khẩu nếu mật khẩu của họ đã hết hạn.Tôi nên đặt séc có thể chuyển hướng yêu cầu ở đâu?

Tôi muốn đặt mã này ở một nơi để mọi yêu cầu có thể được chuyển hướng đến trang thay đổi mật khẩu.

Tôi đã xem xét mở rộng AuthorizeAttribute và ghi đè OnActionExecuting, nhưng không hoạt động/cho phép tôi ngắn mạch logic định tuyến để chuyển hướng đến trang thay đổi mật khẩu.

Đối với một giải thích chút, logic sẽ là:

yêu cầu trái phép:
-> bất kỳ URL -> AuthorizeAttribute -> Login.aspx -> mật khẩu hết hạn -> ChangePassword.aspx

yêu cầu ủy quyền :
-> URL bất kỳ ->??????? -> ChangePassword.aspx

Điều đó ???? một phần mà tôi không chắc chắn phải làm gì.


Tôi nghĩ rằng tôi sẽ đi với mở rộng AuthorizeAttribute. Tôi sẽ sử dụng ở mọi nơi ngoại trừ các phương pháp điều khiển thay đổi mật khẩu.

Trả lời

6
public class DenyExpiredPasswordAttribute : AuthorizeAttribute 
{ 

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

     if(user != null) 
     { 
      if (user.Identity.IsAuthenticated) 
      { 

       if (CurrentUser.PasswordExpired) // your checking of password expiration 
       { 
        filterContext.HttpContext.Response.Redirect("~/Account/ChangePassword?reason=expired"); 
       } 
      } 
     } 
     base.OnAuthorization(filterContext); 
    } 
} 

này hoạt động tốt, chỉ cần đánh dấu tất cả các bộ điều khiển với thuộc tính này loại trừ "Tài khoản" một. Bằng cách này, không người dùng nào có thuộc tính hết hạn có thể tiếp tục cho đến khi thay đổi mật khẩu.

+1

Đây thực chất là những gì tôi đã làm. – Will

+1

Tôi biết đây là một câu trả lời cũ, vì vậy tôi nghĩ rằng tôi sẽ thêm rằng (ít nhất là cho MVC3) 'filterContext.HttpContext.Response.Redirect (" ~/Account/ChangePassword? Reason = hết hạn ");' nên được thay thế bằng ' filterContext.Result = new RedirectResult ("~/Account/ChangePassword? reason = hết hạn"); '(Dựa trên: http://stackoverflow.com/a/2187364/700926 và http://stackoverflow.com/a/2765148/700926) –

1

Bạn có thể xem xét thêm trình xử lý sự kiện cho sự kiện PostAuthenticateRequest trong global.asax.

protected void Application_Start(object sender, EventArgs e) { 
    this.PostAuthenticateRequest += new EventHandler(Global_PostAuthenticateRequest); 
} 

void Global_PostAuthenticateRequest(object sender, EventArgs e) 
{ 
if (passwordExpired) { 
    Context.Response.Redirect("~/ChangePassword.aspx"); 
    } 
} 
+0

Đã cố gắng, nhưng dường như sự kiện đó bị bỏ qua trong MVC. – Will

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