Как передать данные маршрута из ActionFilterAttribute в метод действия? - PullRequest
0 голосов
/ 03 января 2019

Я перенаправляю пользователей к просмотру входа в систему, если сеанс истек, используя ActionFilterAttribute, как показано ниже.

Теперь я хочу сохранить данные о маршруте в исходном запросе, чтобы я мог направить пользователя обратно к этому представлению после входа в систему.

Как отправить исходные данные маршрута в метод действия Login?

public class BaseController : Controller
{
    public int? BranchId {get => HttpContext.Session.GetInt32("BranchId") as int?;}
    public string Admin {get => HttpContext.Session.GetString("Admin") as string;}

    public BaseController() {}
}

public class AdminOrBranchesAccessAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        base.OnActionExecuting(context);

        if ((context.Controller as BaseController).Admin == null &&
            (context.Controller as BaseController).BranchId == null)
        {
            context.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "Home",
                action = "Login"
            }));
        }
    }
}

[AdminOrBranchesAccess]
public async Task<IActionResult> Details(int? id)
{
    // Some stuff going on
    return View();
}

1 Ответ

0 голосов
/ 03 января 2019

Чтобы переадресовать на предыдущее действие после успешного входа в систему, необходимо указать URL возврата для действия входа в систему и установить его значение в OnActionExecuting.

  1. Измените метод Login, как показано ниже, с параметром returnUrl

    [HttpGet]
    [AllowAnonymous]
    public async Task<IActionResult> Login(string returnUrl = null)
    {
        // Clear the existing external cookie to ensure a clean login process
        await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
    
        ViewData["ReturnUrl"] = returnUrl;
        return View();
    }
    
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
    {
        ViewData["ReturnUrl"] = returnUrl;
        if (ModelState.IsValid)
        {
            // This doesn't count login failures towards account lockout
            // To enable password failures to trigger account lockout, set lockoutOnFailure: true
            var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: true);
            if (result.Succeeded)
            {
                _logger.LogInformation("User logged in.");
                return RedirectToLocal(returnUrl);
            }
            if (result.RequiresTwoFactor)
            {
                return RedirectToAction(nameof(LoginWith2fa), new { returnUrl, model.RememberMe });
            }
            if (result.IsLockedOut)
            {
                _logger.LogWarning("User account locked out.");
                return RedirectToAction(nameof(Lockout));
            }
            else
            {
                ModelState.AddModelError(string.Empty, "Invalid login attempt.");
                return View(model);
            }
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
    }
    
  2. AdminOrBranchesAccessAttribute

    public class AdminOrBranchesAccessAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            base.OnActionExecuting(context);
    
            if ((context.Controller as BaseController).Admin == null &&
                (context.Controller as BaseController).BranchId == null)
            {
                context.Result = new RedirectToRouteResult(new RouteValueDictionary(new
                {
                    controller = "Home",
                    action = "Login",
                    returnUrl = context.HttpContext.Request.Path
                }));
            }
        }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...