Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MVC项目中创建登录控制器_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

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

C# 在MVC项目中创建登录控制器,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,因此,我正在使用framework 4.5中的ASP.NET MVC4创建一个web应用程序。我想增加一个帐户系统。我已经创建了一个包含用户和角色的数据库,现在需要将其与我的web应用程序连接 我已使用visual studio工具添加ADO.NET实体数据模型,并已连接到我的数据库,选择所有表并单击“生成”。我得到了用户表和组表的类,以及数据库上下文的类(不确定这是什么)。在向导创建了类文件之后,我出去寻找保护用户的方法(密码加密和用户验证),并看到了一篇web文章。我在models文件夹中创

因此,我正在使用framework 4.5中的ASP.NET MVC4创建一个web应用程序。我想增加一个帐户系统。我已经创建了一个包含用户和角色的数据库,现在需要将其与我的web应用程序连接

我已使用visual studio工具添加ADO.NET实体数据模型,并已连接到我的数据库,选择所有表并单击“生成”。我得到了用户表和组表的类,以及数据库上下文的类(不确定这是什么)。在向导创建了类文件之后,我出去寻找保护用户的方法(密码加密和用户验证),并看到了一篇web文章。我在models文件夹中创建了这个类

现在是控制器的问题了,这里是问题所在。当我查看将web登录集成到模板中的模板项目的源代码时,我只会感到困惑。登录控件中的方法总是有
returnurl
参数,我不知道这是从哪里来的。它还使用
WebSecurity.Login()
方法登录,我想知道如何让我的web应用程序使用我以前引用过的方法

Ofc,如果有一种更简单的方法来做到这一点,而不让VS自动生成很多我不知道该怎么做的代码,那么最好使用它,如果我不需要的话,我不希望有对应用程序没有用处的代码

数据库本身是自定义的,也就是说,由internet应用程序模板自动生成的表不适合我的需要。我在web上找到的大多数教程(包括注释中的教程)都是使用内置实体框架数据库的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表,并创建第一个管理员用户,如下所示:

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)

我得到以下错误:

数据类型text和varchar在等于运算符中不兼容。


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

好的,所以我的问题是因为我创建了文本类型的列,所以字符串输入(转换为varchar)无法与文本进行比较。我更改了数据库,现在没有问题了。数据库的更改发生在我使用
db.SaveChanges()
方法duh:)之后。

为什么假设VS生成“垃圾代码”?我敢肯定,该代码已经过很好的测试,可能会满足您的需求。这可能也会为你节省一些时间。如果您想要一个健壮而灵活的身份验证系统,您应该看看新的身份工具:我可能使用了错误的术语。我想说的是,我不喜欢使用我不熟悉的代码。在帖子中添加了额外的说明如果你不熟悉,为什么不熟悉呢。NET的文档非常丰富,而MVC是一个相对较新的框架,这一事实使它更易于使用。