我想同时允许用户和用户通过一个视图登录,但是当用户登录时,他应该被引导到另一个视图,而当用户登录时,他应该被引导到另一个视图。这是我的数据库:
我进行了简单的注册,但是我需要制作一个登录表单,具体取决于用户被定向到视图的角色。
我已建立登录存储过程:
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核心项目,并研究应该如何做。在您的情况下,可以在控制器方法中使用重定向动作,但这不是一个好习惯,无论如何,请查看this link。
您可以使用RedirectToAction()方法,然后重定向到的操作可以返回一个View。最简单的方法是:
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应用程序中基于角色的身份验证。
您将在注册用户时分配角色,当他们登录时,将根据其角色打开不同的页面。
您可以检查以下链接,同样对您有帮助。https://www.c-sharpcorner.com/UploadFile/rahul4_saxena/role-based-access-of-an-mvc-application/
我将尝试提供一种解决方案,以保持您现有的结构并仅使用1个DB调用。
首先,更改您的登录过程以返回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
接下来,您需要将Validate_User
功能修改为类似以下内容:
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);
}
}
至此,您已经扮演了角色,围绕布尔(userIsValid)的逻辑应该仍然一致。现在,您只需要调用Validate_User并检索用户的角色。看起来应该像这样:
string role = string.empty;
if (Validate_User(loginModel, out role))
{
if (role == "Admin")
{
return View("AdminView");
}
else
{
return View("UserView");
}
}
else
{
//handle failed login
}
希望这对您有所帮助,没有进行测试,但是应该可以正常工作。
请记住,如果还有更多的逻辑需要运行或需要返回特定于视图的数据,则需要执行RedirectToAction
。如果只是要加载的页面,则只需返回View
。