在内置MVC 4身份验证中覆盖User.Identity.Name

时间:2013-07-30 06:02:57

标签: c# asp.net-mvc-4

我很难解决这个问题,并且确实需要这个工作。我必须使用内置身份验证覆盖MVC 4中User.Identity.Name的值。

这是Login()的控制器:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model, string returnUrl)
{
    //OLD CODES:
    //if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
    //{
    //    return RedirectToLocal(returnUrl);
    //}

    // check if correct credentials
    if (ModelState.IsValid && IsValidUser(model.UserName, model.Password))
        return RedirectToAction("Index", "Home");

    ModelState.AddModelError("", "The user name or password provided is incorrect.");
    return View(model);
}

请注意,我已将WebSecurity.Login(model.UserName, model.Password)修改为IsValidUser(model.UserName,model.Password)以检查用户帐户,但工作正常。

如果登录成功,我想要覆盖User.Identity.Name的值。

这是我的IsValidUser(model.UserName,model.Password)方法:

public bool IsValid(string _username, string _pwd)
        {
            _username = _username.Trim();
            OleDbConnection conn = new OleDbConnection();
            string strCon = string.Format(GlobalDBStrings.CONNSTRING, _username, _pwd);
            conn.ConnectionString = strCon;
            bool isConnected = false;

            try
            {
                conn.Open();
                if (conn.State.ToString() == "Open")
                {
                    // I WANT TO MODIFY THE VALUE OF User.Identity.Name here
                    // User.Identity.Name = ?
                    isConnected = true;
                }
            }//try
            catch (Exception ex)
            {
            }//catch
            finally
            {
                conn.Close();
                conn.Dispose();
            }//finally
            return isConnected;
        }

到目前为止,我已尝试过User.Identity.Name = _username;,但根本无效。

1 个答案:

答案 0 :(得分:2)

如果您使用的是FormsAuthentication,则在使用SetAuthCookie方法重定向之前,需要使用当前经过身份验证的用户的名称设置Cookie:

if (ModelState.IsValid && IsValidUser(model.UserName, model.Password))
{
    FormsAuthentication.SetAuthCookie("FooBar", false);
    return RedirectToAction("Index", "Home");
}

现在,在目标控制器操作(/Home/Index)上,User.Identity.Name将为FooBar

通常这会发生在您评论的方法中,如果您不发出表单身份验证Cookie,则您的用户甚至不会通过身份验证。

IsValid方法中的代码而言,我可以说的是IDisposable资源应该包含在using语句中,以确保正确释放资源。