代码之家  ›  专栏  ›  技术社区  ›  Stian

如何将路由数据从actionfilterattribute传递到action方法?

  •  0
  • Stian  · 技术社区  · 6 年前

    如果会话已过期,我将用户路由到登录视图,使用 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 回复  |  直到 6 年前
        1
  •  1
  •   Edward    6 年前

    要在成功登录后重新选择上一个操作,需要为登录操作提供返回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
                  }));
              }
          }
      }