1

MVC4コードファーストアプリケーションでカスタムユーザーテーブルを使用したい。データベースコンテキストで事前ユーザーテーブルを定義しました。

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);

コントローラでは、Add(entity)を使用してユーザーエンティティを保存します。保存後、ユーザーにログインしたい。しかし、それは機能しません:

    [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()でのみ実行する必要がありますか?

独自の保存方法を使用できる場合、データベースにパスワードを保存するにはどうすればよいですか?

4

1 に答える 1

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);
        }
    }
于 2013-01-08T14:42:31.227 に答える