2013-01-08 59 views
1

我想在MVC 4代碼優先應用程序中使用我自定義的用戶表。我定義提前用戶表在我的數據庫方面:如何在MVC 4中登錄我的自定義用戶表?

public class MyDatabase : DbContext 
    { 
     public DbSet<User> UserSet { get; set; } 
     public DbSet<News> NewsSet { get; set; } 
     ... 
    } 

模式是這樣的:

public class User 
    { 
     [Key] 
     public int Id{ get; set; } 
     public string UserName { get; set; } 
     public string Password { get; set; } 
     public string Name { get; set; } 
     public string SurName { get; set; } 
     ... 
    } 

當應用程序啓動時,它調用此:

WebSecurity.InitializeDatabaseConnection("MyDatabase", "Users", "Id", "UserName", autoCreateTables: true); 

在控制器我用添加(實體)保存用戶實體。保存後我想登錄用戶。但它不起作用:

[HttpPost] 
    public ActionResult Register(User user) 
    { 
    var result = MyService.SaveUser(user); 
    WebSecurity.Login(result.UserName, result.Password, true); 
    return RedirectToAction("Index", "Profile", new { id = result.Id }); 
    } 

保存用戶後,它的數據存儲在我的數據庫中,但它無法登錄。我該怎麼辦?

編輯:

那麼,是否可以保存用戶實體與我的業務方法?或者我必須只用 WebSecurity.CreateUserAndAccount()來做到這一點?

如果我可以使用我自己的保存方法,如何在數據庫中保存密碼?

+1

**不這樣做**。千萬不要將密碼作爲純文本存儲在數據庫中。使用鹽漬散列。這實際上很難做到 - 使用內置的成員系統來代替。 –

+0

如果我將密碼存儲在數據庫中作爲散列代碼,會問題解決嗎? –

+1

看看這篇關於安全性的文章:http://stackoverflow.com/questions/1054022/best-way-to-store-password-in-database並查看http://security.stackexchange.com/。 – Syneryx

回答

4

您可以直接使用表單身份驗證。

[HttpPost] 
    public ActionResult Register(User user) 
    { 
    var result = MyService.SaveUser(user); 
    SignIn(result.Id, ""); 
    return RedirectToAction("Index", "Profile", new { id = result.Id }); 
    } 


public void SignIn(string accountId, string roles) 
      { 
       var authTicket = new FormsAuthenticationTicket(
        1, 
        accountId, 
        DateTime.Now, 
        DateTime.Now.AddMinutes(20), 
        false, 
        roles 
        ); 

       string encryptedTicket = FormsAuthentication.Encrypt(authTicket); 
       var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 

       HttpContext.Current.Response.Cookies.Add(authCookie); 
      } 

這是一個用戶類,它將幫助您解決密碼問題。它依賴於BCrypt

public class UserAccount 
    { 
     public string Id { get; set; } 
     public string Username { get; set; } 
     public string Email { get; set; } 

     public string Password 
     { 
      get { return PasswordHash; } 
      set { PasswordHash = HashPassword(value); } 
     } 

     public string PasswordHash { get; private set; } 

     public List<string> Roles { get; set; } 

     public string AuthenticationRoles 
     { 
      get { return Roles == null ? "" : String.Join(",", Roles.Select(x => x.ToString())); } 
     } 

     public bool IsActive { get; set; } 

     public string Name { get; set; } 

     public bool PasswordIsValid(string password) 
     { 
      bool matches = BCrypt.Net.BCrypt.Verify(password, Password); 
      return matches; 
     } 

     private string HashPassword(string value) 
     { 
      return BCrypt.Net.BCrypt.HashPassword(value); 
     } 
    } 
+0

我首次使用FormsAuthentication。它適用於我,但如何在使用FormsAuthentication登錄後獲取當前用戶的數據? ID,角色等。 –

+1

HttpContext.Current.User.Identity.Name - 這將讀取cookie並返回名稱。我們將名稱設置爲表單身份驗證票證中的用戶標識。從那裏你可以查詢你的數據庫獲得額外的用戶數據 –

+0

在此先感謝。你幫了我很多。 –

相關問題