繁体   English   中英

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

[英]creating a login controller in MVC project

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

我已使用Visual Studio工具添加了ADO.NET实体数据模型,并已连接到我的数据库,选择了所有表并单击“生成”。 我有用于用户和组表的类,以及用于database.context的类(不确定这是什么)。 向导创建了类文件后,我出去寻找一种保护用户的方法(密码加密和用户验证),并浏览了 Web文章。 我在models文件夹中创建了该类。

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

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

数据库本身是自定义的,也就是说,由Internet应用程序模板自动生成的表不适合我的需求。 我在网上找到的大多数教程,包括注释中的一个,都在使用带有UserProfile表和Membership表的实体框架数据库构建。 我是否可以调整此方法,以使创建的表具有不同的结构? 如果那种方法更好的话。

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

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表,并创建第一个admin用户,如下所示:

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.

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM