我很难解决这个问题,并且确实需要这个工作。我必须使用内置身份验证覆盖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;
,但根本无效。
答案 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
语句中,以确保正确释放资源。