2009-08-26 7 views
1

私は、ユーザーが3か月ごとにパスワードを変更する必要があるユーザーモデルを持っています。私は何らかの形でユーザがログインしているかどうかを確認する必要があります(サイトの特定のセクションで匿名のブラウザを許可しています)。パスワードが期限切れになった場合は、他の操作を行う前に新しいパスワードを入力してください。すべてのアクションの前にユーザーデータを確認する

これを行うには、AccountのChangePasswordアクションを除いて、すべてのアクションに少しのコードを追加することがあります。たとえば:

var authenticatedUser = GetAuthenticatedUser(); 
if (authenticatedUser != null && authenticatedUser.IsPasswordExpired) 
    return RedirectToAction("Account", "ChangePassword"); 

明らかに、この問題を解決するには恐ろしい方法ですが、正しい方法は何か分かりません。何か案は?私は、これからもっと多くのユーザーデータチェックを追加しなければならないと確信しています。だから今私は本当に良い解決策を見つけたいと思っています。

答えて

4

ベースコントローラクラスでカスタム認証を行います(私のすべてのコントローラはこれから派生しています)。保護されたController.OnAuthorizationメソッドをオーバーライドすることができます。 OnAuthorizationはController.Initializeメソッドの後に呼び出されるので、Initializeメソッドに他のカスタムロジックを配置する場合は、これが最初に呼び出されることを覚えておいてください。

/// <summary> 
    /// Called when authorization occurs. 
    /// </summary> 
    /// <param name="filterContext">Contains information about the current request and action.</param> 
    protected override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     // Do custom authentication here. 
     Authenticate(); 

     base.OnAuthorization(filterContext); 
    } 
+1

これは良い解決策のようです。残念ながら、私は数日間コンピュータから離れていて、試してみることはできません。簡単な質問 - OnAuthorizeは、アクションがAuthorize属性を使用していない場合でも常に呼び出されますか? – Jason

+1

はい、常に呼び出されます。 – jimr

+0

ダイレクトページヒットでこれが呼び出されない理由を知っていますか? – IronicMuffin

0

独自のHttpModuleを作成し、リクエストごとに一度だけ検証することができます。 HttpModuleから派生させ、web.config httpModules設定セクションに貼り付けることができます。

関連する問題