2013-07-30 18 views
0

我很難弄明白這一點,並且確實需要這個工作。我必須使用內置認證覆蓋MVC 4中User.Identity.Name的值。在內置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;,但根本不起作用。

回答

2

如果您正在使用FormsAuthentication則需要使用SetAuthCookie方法重定向之前設置與當前已驗證用戶的名字的cookie:

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

目標控制器動作(/Home/Index)現在,User.Identity.NameFooBar

通常這發生在您評論的方法中,如果您未發出表單身份驗證Cookie,您的用戶甚至沒有通過身份驗證。

IsValid方法中的代碼而言,我只能說IDisposable資源應該包含在using語句中以確保正確釋放資源。

+0

所有頁面都可以訪問User.Identity.Name嗎?像會議?對不起,我是MVC 4的新手 –

+1

是的,無論何處你都有一個'HttpContext',這在所有控制器操作和視圖中都是非常容易的。 –

+0

是的。我現在開始工作了。非常感謝。但還有一個問題,安全嗎?或者如果有更好的方法來做這個,你有什麼建議嗎?順便說一句,我使用Oracle作爲數據庫。 –