2009-05-07 15 views
6

Kullanıcıların parolalarının süresi dolduğunda Parolayı Değiştir sayfasına yönlendirmem gerekiyor.Bir isteği yeniden yönlendirebilecek bir kontrol yerleştirmeliyim?

Bu kodu herhangi bir isteğin değişiklik parolası sayfasına yönlendirilebilmesi için tek bir yere yerleştirmek istiyorum.

AuthorizeAttribute'u genişletmeyi ve OnActionExecuting'i geçersiz kılmayı inceledim, ancak parola değiştirme sayfasına yönlendirmek için yönlendirme mantığını kısa devre yapmam için bana izin verin.

biraz fazla açıklama için, mantık şöyle olacaktır:

Yetkisiz istek:
-> herhangi bir URL'yi -> AuthorizeAttribute -> Login.aspx -> ChangePassword.aspx

Yetkili isteği -> parolasının süresi :
-> herhangi bir URL ->??????? -> ChangePassword.aspx

Bu onun ???? Ne yapacağımı bilemediğim kısım.


Sanırım AuthorizeAttribute'ı genişletmeyeceğim. Parola değiştirme denetleyicisi yöntemlerini dışındaki her yerde kullanacağım .

cevap

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); 
    } 
} 

bu iyi çalışır, sadece bu özelliğin her kontrolör "Hesap" birini dışarıda işaretleyin. Bu şekilde süresi dolmuş olan bir kullanıcı şifre değiştirilene kadar devam edemez.

+1

Bu, esasen gittiğim şey. – Will

+1

Bunun eski bir cevap olduğunu biliyorum, bu yüzden bunu eklemeliyim (en azından MVC3 için) filterContext.HttpContext.Response.Redirect ("~/Account/ChangePassword? Reason = süresi doldu"); 'ile değiştirilmelidir filterContext.Result = new RedirectResult ("~/Hesap/ChangePassword? reason = süresi doldu"); '(Şu adrese bağlı olarak: http://stackoverflow.com/a/2187364/700926 ve http://stackoverflow.com/a/2765148/700926) –

1

Global.asax'ta PostAuthenticateRequest olayı için bir olay işleyicisi eklemeye bakabilirsiniz.

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

Bunu denedim, ancak bu olay MVC'de terk edildi. – Will

İlgili konular