Próbuję przekierować użytkownika do innej akcji, jeśli jego adres e-mail nie został zweryfikowany. Chodzi o to, że nie chcę ich wylogować, po prostu chcę je przekierować. Kiedy robię to w OnAuthorization dla kontrolera, przekierowuje zgodnie z oczekiwaniami, ale użytkownik nie jest uwierzytelniony. Nie jestem pewien, dlaczego tak jest. Mój kod wygląda następująco:Przekierowanie MVC w trybie Autoryzacja powoduje niepowodzenie autoryzacji
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);
}
}
}
Uwaga: Usunąłem niepotrzebny kod, aby było bardziej zrozumiałe. _applicationService.CurrentUser jest zapełniony bieżącym użytkownikiem - i użytkownik został poprawnie uwierzytelniony, gdy dojdzie do tego punktu. Ale po przekierowaniu użytkownik nie jest już uwierzytelniany.
Jak mogę uzyskać to przekierowanie bez wpływu na autoryzację użytkownika?
Próbowałem wprowadzić mój kod do OnActionExecuting, a także próbowałem go wdrożyć w niestandardowej ActionFilterAttribute, ale gdziekolwiek umieścić to przekierowanie w nim zapobiega "Użytkownikowi" (tj: System.Security.Principal .IPrincipal Controller.User) od uzyskania uwierzytelnienia.
Czego mi tu brakuje? Mam nadzieję, że to ma sens. Każda pomoc doceniona.
W odpowiedzi na wniosek Darin za mojego działania logowanie:
[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);
}
Czy możesz pokazać, w jaki sposób uwierzytelniasz użytkownika - twoją akcję "LogOn"? –
@DarinDimitrov - Dodałem moją akcję logowania zgodnie z żądaniem. – soupy1976
Tego właśnie szukałem! Zaoszczędziłam dużo czasu – JosephDoggie