特別な認証グローバルアクションフィルターが必要です。
問題の解決策は次のとおりです。コントローラアクションが呼び出される前に実行されるグローバルアクションフィルタを導入する必要があります。このイベントの名前はOnActionExecuting
です。また、このグローバルアクションフィルター内で、ユーザーが有効な認証Cookieを持っているが、永続性(DB)にはもう存在しない(そしてそのCookieを削除する必要がある)というシナリオを処理することもできます。
アイデアを得るためのコード例は次のとおりです。
public class LoadCustomPrincipalAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
CustomIdentity customIdentity;
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
UserData userData = UserRepository.GetUserByName(HttpContext.Current.User.Identity.Name);
if (userData == null)
{
//TODO: Add here user missing logic,
//throw an exception, override with the custom identity with "false" -
//this boolean means that it have IsAuthenticated on false, but you
//have to override this in CustomIdentity!
//Of course - at this point you also remove the user cookie from response!
}
customIdentity = new CustomIdentity(userData, true);
}
else
{
customIdentity = new CustomIdentity(new UserData {Username = "Anonymous"}, false);
}
HttpContext.Current.User = new CustomPrincipal(customIdentity);
base.OnActionExecuting(filterContext);
}
}
お役に立てば幸いです。
このアクションフィルターをグローバルフィルターとして登録することを忘れないでください。あなたはこれを次のように行うことができます:
private static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new LoadCustomPrincipalAttribute());
}
これを追加するだけです。放っておいてAuthorizeAttribute
ください。意図したとおりに機能するはずです。状態をチェックするだけHttpContext.Current.User.Identity.IsAuthenticated == true
です。それを上書きする必要がある状況がありますが、これはそうではありません。開始する前に、適切なユーザー/認証処理が本当に必要ですAuthorizeAttribute
。