2

基于默认的身份框架,我想在用户登录应用程序时设置一个会话变量。

这很好用:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if(ModelState.IsValid)
    {
        // Validate the password
        IdentityResult result = await IdentityManager.Authentication.CheckPasswordAndSignInAsync(AuthenticationManager, model.UserName, model.Password, model.RememberMe);

        if(result.Success)
        {
            //save display name in session view
            SiteUser user = await _siteDbContext.Users.SingleOrDefaultAsync(u => u.UserName == model.UserName);
            Session["displayName"] = user.DisplayName;

            return RedirectToLocal(returnUrl);
        }

        AddErrors(result);
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

这将显示在站点的顶部栏中,并带有以下行:

@Html.ActionLink(Session["displayName"].ToString(), "Manage", "Account", null)

但是,当我在选中“记住我”选项的情况下登录时,关闭浏览器并重新启动它,会话变量不会被设置,并且页面会引发空引用异常。

稍微挖掘一下,似乎该/Account/Login操作被设置为默认登录路径,但它永远不会被 cookie 身份验证调用。

如何在身份验证过程的中间或之后立即设置会话变量?

4

0 回答 0