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获取“角色”。