c# - MVC 5 - 在登录时设置 session 变量

标签 c# asp.net-mvc asp.net-mvc-5

我正在构建一个 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/

相关文章:

c# - 通过中继器迭代

javascript - 在动态下拉列表AngularJS中使用ng-init

c# - ASP.NET MVC 中的存储过程 For Each 循环

ASP.NET 数据缓存与 Azure Redis 缓存?

c# - 将密码查询转换为 C#

c# - 无法加载文件或程序集 'Microsoft.Data.OData, Version=5.6.4.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 或其依赖项之一

c# - 如何识别 32 位进程

javascript - jquery 不起作用的表格突出显示行

asp.net-mvc - 后期操作中的模型更改在 Html.TextBoxFor 中不可见?

c# - 特殊 MVC 路由不起作用