You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MVC C#中登录过期退出后如何重定向至原页面?

完全可以实现这个需求!

你看到的/Account/Login?ReturnUrl=%2Fhome%2Ftest里的ReturnUrl参数就是关键——MVC5 Identity已经帮你自动记录了超时前用户所在的页面地址,接下来只需要在登录逻辑里正确处理这个参数,就能实现登录后跳转回原页面的效果。

下面是具体的实现步骤:

1. 在Login Get方法中接收并传递ReturnUrl

首先确保你的AccountController里的Get请求Login方法接收returnUrl参数,并把它传递给视图:

[HttpGet]
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
    // 将ReturnUrl存入ViewBag,方便视图使用
    ViewBag.ReturnUrl = returnUrl;
    return View();
}

2. 登录成功后根据ReturnUrl重定向

在Post请求的Login方法里,当用户登录验证通过后,先检查returnUrl是否是有效的本地URL(这一步非常重要,能避免开放重定向安全漏洞),如果有效就跳转到该地址,否则跳转到默认首页:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    // 执行登录验证
    var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
    switch (result)
    {
        case SignInStatus.Success:
            // 验证ReturnUrl的有效性:必须是本地URL且不为空
            if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                // 默认跳转到首页
                return RedirectToAction("Index", "Home");
            }
        case SignInStatus.LockedOut:
            return View("Lockout");
        case SignInStatus.RequiresVerification:
            return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
        case SignInStatus.Failure:
        default:
            ModelState.AddModelError("", "无效的登录尝试,请检查账号密码。");
            return View(model);
    }
}

3. 在登录视图中传递ReturnUrl参数

打开Login.cshtml视图,确保表单提交时能把returnUrl参数带到Post方法里,通常通过隐藏字段实现:

@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()
    
    <!-- 账号、密码输入框等内容 -->
    
    <!-- 添加隐藏字段传递ReturnUrl -->
    @Html.Hidden("returnUrl", ViewBag.ReturnUrl)
    
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="登录" class="btn btn-default" />
        </div>
    </div>
}

4. 确认超时退出的Cookie配置

最后检查你Startup类里的Cookie认证配置,确保LoginPath设置正确,并且会话超时配置符合你的需求:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    // 超时后跳转的登录页面,Identity会自动附加ReturnUrl
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider
    {
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(30), // 你的超时验证间隔
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    },
    ExpireTimeSpan = TimeSpan.FromMinutes(30), // 会话超时时间
    SlidingExpiration = true // 滑动过期:用户有操作时自动重置超时时间
});

只要完成以上步骤,当用户从home/test页面因超时退出并跳转至登录页时,登录成功后就会自动回到home/test页面了。

内容的提问来源于stack exchange,提问作者Parvez

火山引擎 最新活动