我正在构建一个 MVC 5 应用程序并遇到了以下问题:如果用户与我有协议(protocol),我想在用户登录后向用户显示一个菜单项。
我想在用户登录时设置一个 session 变量,例如:
Session["HasAgreement"] = Agreement.HasAgreement(userId);
然后在我构建菜单的 _Layout.cshtml 文件中执行如下操作:
@if (Session["HasAgreement"] == "True")
{
<li>@Html.ActionLink("Agreement", "Agreement", "Home")</li>
}
我的问题出现在我已将逻辑添加到标准登录操作的 AccountController 中:
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:
var userId = User.Identity.GetUserId();
Session["HasAgreement"] = Agreement.HasAgreement(userId);
return RedirectToLocal(returnUrl);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
这是标准的 MVC 5 登录 - 除了我在“case SignInStatus.Success:”之后添加了两行,我在其中尝试获取 userId,然后设置 Session 变量。
我的问题是此时用户未通过身份验证(我认为这发生在上面的 SignInManager 中)。
如何在用户登录后立即设置 session 变量?
最佳答案
在您点击下一个操作之前,不会设置新 session 。这是尝试将结果用于重定向以外的任何事情的常见问题。最好的做法是使用结果重定向到另一个操作,然后您将能够访问该 session 。
假设当您的用户登录时,他们会转到“仪表板”,它可能类似于:
SignInStatus.成功案例:
case SignInStatus.Success:
return RedirectToAction("Dashboard");
如果您需要返回多个操作的能力,您可以返回操作名称而不是 url,只需执行 RedirectToAction(returnAction)
。显然,如果您还需要指定 Controller ,则还需要发布一个 returnController
。
仪表板操作:
[Authorize]
public ActionResult Dashboard() {
var userId = User.Identity.GetUserId();
Session["HasAgreement"] = Agreement.HasAgreement(userId);
return View();
}
关于c# - MVC 5 - 在登录时设置 session 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28899125/