在MVC项目中创建登录控制器

时间:2014-02-28 15:46:30

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

所以我在框架4.5中使用ASP.NET MVC4创建一个Web应用程序。我想添加一个帐户系统。我创建了一个包含用户和角色的数据库,现在需要将其与我的Web应用程序连接。

我使用visual studio工具添加ADO.NET实体数据模型,并已连接到我的数据库,选中所有表并单击生成。我得到了用户和组表的类,以及database.context的类(不确定这是什么)。在向导创建了类文件之后,我找到了保护用户的方法(密码加密和用户验证),并且遇到了this网络文章。我在models文件夹中创建了类。

现在它转向控制器,这就是问题所在。当我查看模板项目的源代码时,将Web登录集成到模板中我只会感到困惑。登录控制器中的方法始终具有returnurl参数,我不知道它来自何处。它还使用WebSecurity.Login()方法登录,我想知道如何让我的网络应用程序使用我之前引用的方法。

Ofc,如果有一种更简单的方法可以做到这一点而不让VS自动生成很多我不知道该怎么做的代码,最好使用它代替,我不想拥有代码如果我不需要,这对应用程序没用。

数据库本身是自定义的,也就是说,互联网应用程序模板自动生成的表格不适合我的需要。我在网上找到的大多数教程,包括评论中的一个教程,都是使用userProfile表和成员资格表构建实体框架数据库。有没有办法可以调整它,以便创建的表具有不同的结构?如果这种方法更好的话。

更新: 所以我在代码中得到了这一点。我用以下方法创建了一个用户控制器:

internal bool UserExists(LoginModel model)
private void CheckIfFirstDeploy()
private void RegisterFirstAdmin()
private void registerUser(string ALPHA_ADMIN_USERNAME, string ALPHA_ADMIN_PASSWORD, Group group)
internal bool PasswordValid(LoginModel model)

帐户控制器(即另一个类和文件),实例用户控制器并运行以进行身份​​验证:

[HttpPost]
[AllowAnonymous]
public ActionResult Login(LoginModel model, string returnUrl)
{
    UsersController uc = new UsersController();
    if (ModelState.IsValid && uc.UserExists(model) && uc.PasswordValid(model))
    {
        FormsAuthentication.SetAuthCookie(model.UserName, false);
        return View("Dashboard");
    }
    // If we got this far, something failed, redisplay form
    ModelState.AddModelError("", "The user name or password provided is incorrect.");
    return View(model);
}

当应用程序注意到没有用户条目时,它会运行CheckIfFirstDeploy()功能,使用前3个角色填充groups表,并创建第一个管理员用户,如下所示:

private void RegisterFirstAdmin(){
    const string ALPHA_ADMIN_USERNAME = "username";
    const string ALPHA_ADMIN_PASSWORD = "password";

    if (db.Groups.Count() == 0)
    {
        db.Groups.Add(new Groups()
        {
            GroupName = "Administrator"
        });
        db.Groups.Add(new Groups()
        {
            GroupName = "Manager"
        });
        db.Groups.Add(new Groups()
        {
            GroupName = "User"
        });
    }

    registerUser(ALPHA_ADMIN_USERNAME, 
                 ALPHA_ADMIN_PASSWORD, 
                 Group.Administrator);


}

private void registerUser(string ALPHA_ADMIN_USERNAME, 
                          string ALPHA_ADMIN_PASSWORD, 
                          Group group) {

    db.Users
        .Add(
            new Users() { 
                Email = ALPHA_ADMIN_USERNAME,
                Hash = Crypto.PasswordHash.CreateHash(ALPHA_ADMIN_PASSWORD),
                GroupId = 1
            }
        );
}

当我运行应用程序时,我遇到了一些问题。首先,似乎数据库没有填充我打算插入的组,其次是我所拥有的 if (db.Users.Count(u => u.Email == model.UserName) != 1)

我收到以下错误:

The data types text and varchar are incompatible in the equal to operator.

数据库中的类型是文本,代码中的类型定义为字符串。

1 个答案:

答案 0 :(得分:0)

好的,所以我的问题与我创建了类型为text的列这一事实有关,因此字符串输入(转换为varchar)无法与文本进行比较。我改变了我的数据库,现在没有问题。一旦我使用db.SaveChanges()方法,duh:),就会发生对数据库的更改。