Asp.net mvc验证用户登录之Forms实现的示例分析
创始人
2024-11-27 21:24:04
0次

这里我们采用asp.net mvc 自带的AuthorizeAttribute过滤器验证用户的身份,也可以使用自定义过滤器,步骤都是一样。

第一步:创建asp.net mvc项目, 在项目的App_Start文件夹下面有一个FilterConfig.cs,在这个文件中可以注册全局的过滤器。我们在文件中添加AuthorizeAttribute过滤器如下:

public class FilterConfig
 {
  public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  {
   filters.Add(new HandleErrorAttribute());
   //将内置的权限过滤器添加到全局过滤中
   filters.Add(new System.Web.Mvc.AuthorizeAttribute());
  }
 }

第二步:在web.config配置文件中修改网站的身份认证为mode="Forms"


 
 
  
 
 
 
 

提示:配置name值作为最终生成的cookie的名称,loginUrl指定当用户未登入是跳转的页面,这里挑战到登入页面

第三步:添加用户登入相关的控制器和视图

创建LoginController控制器:

public class LoginController : Controller
 {
  [HttpGet]
  [AllowAnonymous]
  public ActionResult Index()
  {
   return View();
  }

  [HttpPost]
  [AllowAnonymous]
  public ActionResult Login(User user) 
  {
   if (!user.Username.Trim().Equals("liuxin") || !user.Password.Trim().Equals("abc"))
   {
    ModelState.AddModelError("", "用户名或密码错误");
    return View("index", user);
   }
   //if (!user.Username.Trim().Equals("liuxin")) {
   // ModelState.AddModelError("Username", "用户名错误");
   // return View("index", user);
   //}
   //if (!user.Password.Trim().Equals("abc")) {
   // ModelState.AddModelError("Password", "密码错误");
   // return View("index", user);
   //}
   user.Id = Guid.NewGuid().ToString("D");//为了测试手动设置一个用户id
   FormsAuthHelp.AddFormsAuthCookie(user.Id, user, 60);//设置ticket票据的名称为用户的id,设置有效时间为60分钟
   return Redirect("~");
  }
  [HttpGet]
  public ActionResult Logout() {
   FormsAuthHelp.RemoveFormsAuthCookie();
   return Redirect("~/Login/Index");
  }
 }

特别注意:Index和Login这两个方法得使用“[AllowAnonymous]”指明这两个方法可以匿名访问,否则由于过滤器不允许匿名访问,导致登入页面和用户提交都无法进行。显然这不是我们希望看到的。

提示:为了测试方便这边的用户的数据是写死的,用户的id也是临时生成了一个

public class User
 {
  public string Id { get; set; }
  public string Username { get; set; }
  public string Password { get; set; }
 }

创建登入视图:

@{
 Layout = null;
 ViewBag.Title = "Index";
}

您尚未登入,请登入

@using(Html.BeginForm("Login", "Login", FormMethod.Post)) {  @Html.Label("Username", "用户名:")@Html.TextBox("Username", null, new { id = "Username", placeholder = "请输入用户名" })  @Html.ValidationMessage("Username")
 @Html.Label("Password", "密 码:")@Html.TextBox("Password", null, new { id = "Password", placeholder = "请输入密码" })  @Html.ValidationMessage("Password")
    @Html.ValidationSummary(true) }

提示:当检测到用户未登入,则跳转到web.config中配置的url页面,当用户填写密码并提交时,用户输入的数据会提交到LoginController控制器下的Login方法,验证用户的输入,认证失败重新返回到登入界面,当认证成功,将会执行

<<***FormsAuthHelp.AddFormsAuthCookie(user.Id, user, 60);//设置ticket票据的名称为用户的id,设置有效时间为60分钟***>>,这条语句的作用是生成一个ticket票据,并封装到cookie中,asp.net mvc正式通过检测这个cookie认证用户是否登入的,具体代码如下

第四步:将用户信息生成ticket封装到cookie中

public class FormsAuthHelp
 {
  /// 
  /// 将当前登入用户的信息生成ticket添加到到cookie中(用于登入)
  /// 
  /// Forms身份验证票相关联的用户名(一般是当前用户的id,作为ticket的名称使用)
  /// 用户信息
  /// 有效期
  public static void AddFormsAuthCookie(string loginName, object userData, int expireMin)
  {
   //将当前登入的用户信息序列化
   var data = JsonConvert.SerializeObject(userData);

   //创建一个FormsAuthenticationTicket,它包含登录名以及额外的用户数据。
   var ticket = new FormsAuthenticationTicket(1,
    loginName, DateTime.Now, DateTime.Now.AddDays(1), true, data);

   //加密Ticket,变成一个加密的字符串。
   var cookieValue = FormsAuthentication.Encrypt(ticket);

   //根据加密结果创建登录Cookie
   //FormsAuthentication.FormsCookieName是配置文件中指定的cookie名称,默认是".ASPXAUTH"
   var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue)
   {
    HttpOnly = true,
    Secure = FormsAuthentication.RequireSSL,
    Domain = FormsAuthentication.CookieDomain,
    Path = FormsAuthentication.FormsCookiePath
   };
   //设置有效时间
   if (expireMin > 0)
    cookie.Expires = DateTime.Now.AddMinutes(expireMin);

   var context = HttpContext.Current;
   if (context == null)
    throw new InvalidOperationException();

   //写登录Cookie
   context.Response.Cookies.Remove(cookie.Name);
   context.Response.Cookies.Add(cookie);
  }
  /// 
  /// 删除用户ticket票据
  /// 
  public static void RemoveFormsAuthCookie() {
   FormsAuthentication.SignOut();
  }
 }

第五步:测试执行

1. 启动网站输入相应的网址:如下图

Asp.net mvc验证用户登录之Forms实现的示例分析

2. 此时用户尚未登入将会跳转到登入界面:如下图

Asp.net mvc验证用户登录之Forms实现的示例分析

3.输入错误的密码会重新跳转到登入界面并提示出错

Asp.net mvc验证用户登录之Forms实现的示例分析

4. 输入正确的用户名密码

Asp.net mvc验证用户登录之Forms实现的示例分析

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...