メールアドレスが検証されていない場合、ユーザーを別のアクションにリダイレクトしようとしています。問題は、それらをログアウトさせたくない、ただリダイレクトしたいということです。コントローラのOnAuthorizationでこれを行うと、期待どおりにリダイレクトされますが、ユーザーは認証されません。なぜなのかわかりません。私のコードは次のようになります:
protected override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
//_applicationService.CurrentUser is populated correctly at this point
// from Controller.User
if (_applicationService.CurrentUser != null)
{
if (_applicationService.CurrentUser.EmailVerified != true)
{
var url = new UrlHelper(filterContext.RequestContext);
var verifyEmailUrl = url.Action("EmailVerificationRequired", "Account", null);
filterContext.Result = new RedirectResult(verifyEmailUrl);
}
}
}
注:わかりやすくするために、不要なコードを削除しました。_applicationService.CurrentUserには現在のユーザーが入力され、その時点でユーザーは正しく認証されています。ただし、リダイレクト後、ユーザーは認証されなくなります。
組み込みのユーザー認証に影響を与えずにこのリダイレクトを実現するにはどうすればよいですか?
コードをOnActionExecutingに入れてみました。また、カスタムActionFilterAttributeにも実装しようとしましたが、このリダイレクトをどこに置いても、「ユーザー」(つまり、System.Security.Principal.IPrincipal Controller)ができなくなります。ユーザー)認証を受けることから。
ここで何が欠けていますか?これが理にかなっていることを願っています。どんな助けでも大歓迎です。
ダリンのログインアクションのリクエストに応えて:
[HttpPost]
[AllowAnonymous]
public ActionResult Login(LoginViewModel model, string returnUrl)
{
string errorMessage = "The username or password is incorrect";
if (ModelState.IsValid)
{
if (_contextExecutor.ExecuteContextForModel<LoginContextModel, bool>(new LoginContextModel(){
LoginViewModel = model
}))
{
ViewBag.CurrentUser = _applicationService.CurrentUser;
_formsAuthenticationService.SetAuthCookie(model.LoginEmailAddress, model.RememberMe);
if (_applicationService.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
return RedirectToAction("Index", "Home").Success("Thank you for logging in.");
}
else
{
errorMessage = "Email address not found or invalid password.";
}
}
return View(model).Error(errorMessage);
}