C# MVC中的管理员和用户登录

C# MVC中的管理员和用户登录,c#,asp.net-mvc,model-view-controller,C#,Asp.net Mvc,Model View Controller,我想允许用户和用户通过一个视图登录,但当用户登录时,他应该被引导到另一个视图,当用户登录时,他应该被引导到另一个视图。 这是我的数据库: 我已经做了简单的注册,但我需要做一个登录表单,根据用户被引导到视图的角色。 我创建了一个登录存储过程: Create procedure [dbo].[Login] ( @Username nvarchar (20), @Password nvarchar (20) ) as Begin Select COUNT(*)from Users wher

我想允许用户和用户通过一个视图登录,但当用户登录时,他应该被引导到另一个视图,当用户登录时,他应该被引导到另一个视图。 这是我的数据库:

我已经做了简单的注册,但我需要做一个登录表单,根据用户被引导到视图的角色。

我创建了一个登录存储过程:

 Create  procedure [dbo].[Login]  
(
@Username nvarchar (20),
@Password nvarchar (20)
)
as
Begin
Select COUNT(*)from Users where Username=@Username and Password=@Password
End
和Login.cs类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;

namespace WebApplication19.Models
{
    public class Login
    {
        [Required(ErrorMessage = "Required.")]
        public string Username { get; set; }

        [Required(ErrorMessage = "Required.")]
        public string Password { get; set; }
    }
}
和一个ValidateUser函数

 public bool Validate_User(Login lmodel)
        {

            connection();

            SqlCommand cmd = new SqlCommand("Login");

                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@Username", lmodel.Username);
                    cmd.Parameters.AddWithValue("@Password", lmodel.Password);
                    cmd.Connection = con;
                    con.Open();
                    int i = cmd.ExecuteNonQuery();
                    con.Close();

                    if (i >= 1)
                        return true;
                    else
                        return false;


        }
    }

我不明白如何在我的代码中使用角色。

我认为您可以从具有授权的模板创建asp.net核心项目,并研究应该如何进行。在您的情况下,您可以在控制器方法中使用重定向操作,但这不是一个很好的实践,请看。

您可以使用重定向操作()方法,然后重定向到的操作可以返回一个视图。最简单的方法是:

return RedirectToAction("Index", model);
如果不需要返回模型,请将其清除

return RedirectToAction("Index");

基本上,您希望根据访问者的角色将其重定向到不同的页面。因此,为该角色分配“管理员”、“用户”等角色

之后,当您检查登录时,此时获取角色

var roles = "Select Role from Users where Username=@Username and Password=@Password";

if(roles == "Admin"){
//redirect to admin view
}
else{
//redirect to user view
}

据我所知,在我们的MVC应用程序中,您需要的是基于角色的身份验证

您将在注册用户时分配角色,当用户登录时,您将根据其角色打开不同的页面

你也可以查看下面的链接,这将对你有所帮助。

我将尝试提供一种解决方案,保持现有结构,只使用1db调用

首先,更改您的登录过程以返回UserRole而不是count(在登录的情况下,count实际上没有任何作用)。比如说:

Create  procedure [dbo].[Login]  
(
@Username nvarchar (20),
@Password nvarchar (20)
)
as
Begin
    Select Role from Users where Username=@Username and Password=@Password
End
public bool Validate_User(Login lmodel, out string userRole)
    {
        connection();

        SqlCommand cmd = new SqlCommand("Login");

                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@Username", lmodel.Username);
                cmd.Parameters.AddWithValue("@Password", lmodel.Password);
                cmd.Connection = con;
                con.Open();
                userRole = cmd.ExecuteNonQuery();
                con.Close();

                return !String.IsNullOrEmpty(userRole);


    }
}
string role = string.empty;

if (Validate_User(loginModel, out role))
{
    if (role == "Admin")
    {
        return View("AdminView");
    }
    else
    {
        return View("UserView");
    }
}
else
{
    //handle failed login
}
接下来,您需要修改
Validate\u User
函数。。。变成这样:

Create  procedure [dbo].[Login]  
(
@Username nvarchar (20),
@Password nvarchar (20)
)
as
Begin
    Select Role from Users where Username=@Username and Password=@Password
End
public bool Validate_User(Login lmodel, out string userRole)
    {
        connection();

        SqlCommand cmd = new SqlCommand("Login");

                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@Username", lmodel.Username);
                cmd.Parameters.AddWithValue("@Password", lmodel.Password);
                cmd.Connection = con;
                con.Open();
                userRole = cmd.ExecuteNonQuery();
                con.Close();

                return !String.IsNullOrEmpty(userRole);


    }
}
string role = string.empty;

if (Validate_User(loginModel, out role))
{
    if (role == "Admin")
    {
        return View("AdminView");
    }
    else
    {
        return View("UserView");
    }
}
else
{
    //handle failed login
}
此时,您已经有了自己的角色,bool(userIsValid)的逻辑应该仍然是一致的。现在只需要调用Validate_User并检索用户的角色。应该是这样的:

Create  procedure [dbo].[Login]  
(
@Username nvarchar (20),
@Password nvarchar (20)
)
as
Begin
    Select Role from Users where Username=@Username and Password=@Password
End
public bool Validate_User(Login lmodel, out string userRole)
    {
        connection();

        SqlCommand cmd = new SqlCommand("Login");

                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@Username", lmodel.Username);
                cmd.Parameters.AddWithValue("@Password", lmodel.Password);
                cmd.Connection = con;
                con.Open();
                userRole = cmd.ExecuteNonQuery();
                con.Close();

                return !String.IsNullOrEmpty(userRole);


    }
}
string role = string.empty;

if (Validate_User(loginModel, out role))
{
    if (role == "Admin")
    {
        return View("AdminView");
    }
    else
    {
        return View("UserView");
    }
}
else
{
    //handle failed login
}
希望这对你有帮助,没有给它一个测试,但它应该工作得很好


请记住,如果需要运行更多逻辑或返回特定于视图的数据,则需要执行
重定向操作。如果它只是一个要加载的页面,您只需返回
视图

您能告诉我们您尝试了哪些代码吗?因此,这不是一个代码编写服务。作为旁注-[密码]列nvarchar(20)。。。尽量不要学习用明文存储密码。好吧,如果你只是在学习,但请记住这一点mind@JonathanWillcock您可以检查我编辑过的问题。@Milney是的,我将在以后更改它,但如何根据管理员/用户的角色(用户数据库中的字段)将不同的视图重定向到管理员/用户请查看此链接:@BushraAkram您可以在重定向之前检查角色并选择正确的视图。这不是一个非常直接的答案,SQL字符串
角色
如何突然改变?OP还使用一个存储过程,所以SQL应该在那里。您也可以从SP获取“角色”。