欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET MVC5网站开发之登录、验证和注销管理员篇1(六)

程序员文章站 2023-11-12 23:09:10
上次业务逻辑和展示层的架构都写了,可以开始进行具体功能的实现,这次先实现管理员的登录、验证和注销功能。 一、业务逻辑层1、实现256散列加密方法。 ninesky.co...

上次业务逻辑和展示层的架构都写了,可以开始进行具体功能的实现,这次先实现管理员的登录、验证和注销功能。

一、业务逻辑层1、实现256散列加密方法。

ninesky.core【右键】-> 添加->文件夹,输入文件夹名general。

general文件夹【右键】->添加->类,输入类名security。

引用system.security.cryptography命名空间(1),并实现sha256静态加密方法。

2、administrator模型类

ninesky.core【右键】-> 添加->类,输入类名administrator。

添加引用system.componentmodel.dataannotations; 完成的类代码

using system;
using system.componentmodel.dataannotations;

namespace ninesky.core
{
 /// <summary>
 /// 管理员模型
 /// </summary>
 public class administrator
 {
  [key]
  public int administratorid { get; set; }

  /// <summary>
  /// 帐号
  /// </summary>
  [required(errormessage = "必须输入{0}")]
  [stringlength(30, minimumlength = 4, errormessage ="{0}长度为{2}-{1}个字符")]
  [display(name ="帐号")]
  public string accounts { get; set; }

  /// <summary>
  /// 密码
  /// </summary>
  [datatype(datatype.password)]
  [required(errormessage = "必须输入{0}")]
  [stringlength(256,errormessage = "{0}长度少于{1}个字符")]
  [display(name = "密码")]
  public string password { get; set; }

  /// <summary>
  /// 登录ip
  /// </summary>
  [display(name = "登录ip")]
  public string loginip { get; set; }

  /// <summary>
  /// 登录时间
  /// </summary>
  [display(name = "登录时间")]
  public nullable<datetime> logintime { get; set; }

  /// <summary>
  /// 创建时间
  /// </summary>
  [display(name = "创建时间")]
  public datetime createtime { get; set; }
 }
}

3、数据上下文

打开ninesky.core->nineskycontext.cs 添加administrators属性

红框内为添加内容。

4、administratormanager管理类

ninesky.core【右键】-> 添加->类,输入类名administratormanager。

类继承自basemanager<administrator>。

为类添加ninesky.core.types引用。

using ninesky.core.types;
using system;

namespace ninesky.core
{
 public class administratormanager : basemanager<administrator>
 {
 /// <summary>
 /// 添加
 /// </summary>
 /// <param name="admin">管理员实体</param>
 /// <returns></returns>
 public override response add(administrator admin)
 {
  response _resp = new response();
  if (hasaccounts(admin.accounts))
  {
  _resp.code = 0;
  _resp.message = "帐号已存在";
  }
  else _resp = base.add(admin);
  return _resp;
 }

 /// <summary>
 /// 修改密码
 /// </summary>
 /// <param name="administratorid">主键</param>
 /// <param name="password">新密码【密文】</param>
 /// <returns></returns>
 public response changepassword(int administratorid, string password)
 {
  response _resp = new response();
  var _admin = find(administratorid);
  if (_admin == null)
  {
  _resp.code = 0;
  _resp.message = "该主键的管理员不存在";
  }
  else
  {
  _admin.password = password;
  _resp = update(_admin);
  }
  return _resp;
 }

 /// <summary>
 /// 删除
 /// </summary>
 /// <param name="administratorid">主键</param>
 /// <returns></returns>
 public override response delete(int administratorid)
 {
  response _resp = new response();
  if (count() == 1)
  {
  _resp.code = 0;
  _resp.message = "不能删除唯一的管理员帐号";
  }
  else _resp = base.delete(administratorid);
  return _resp;
 }

 /// <summary>
 /// 查找
 /// </summary>
 /// <param name="accounts">帐号</param>
 /// <returns></returns>
 public administrator find(string accounts)
 {
  return base.repository.find(a => a.accounts == accounts);
 }

 /// <summary>
 /// 帐号是否存在
 /// </summary>
 /// <param name="accounts">帐号</param>
 /// <returns></returns>
 public bool hasaccounts(string accounts)
 {
  return base.repository.iscontains(a => a.accounts.toupper() == accounts.toupper());
 }

 /// <summary>
 /// 更新登录信息
 /// </summary>
 /// <param name="administratorid">主键</param>
 /// <param name="ip">ip地址</param>
 /// <param name="time">时间</param>
 /// <returns></returns>
 public response upadatelogininfo(int administratorid, string ip, datetime time)
 {
  response _resp = new response();
  var _admin = find(administratorid);
  if (_admin == null)
  {
  _resp.code = 0;
  _resp.message = "该主键的管理员不存在";
  }
  else
  {
  _admin.loginip = ip;
  _admin.logintime = time;
  _resp = update(_admin);
  }
  return _resp;
 }

 /// <summary>
 /// 验证
 /// </summary>
 /// <param name="accounts">帐号</param>
 /// <param name="password">密码【密文】</param>
 /// <returns>code:1-成功;2-帐号不存在;3-密码错误</returns>
 public response verify(string accounts, string password)
 {
  response _resp = new response();
  var _admin = base.repository.find(a => a.accounts == accounts);
  if (_admin == null)
  {
  _resp.code = 2;
  _resp.message = "帐号为:【" + accounts + "】的管理员不存在";
  }
  else if (_admin.password == password)
  {
  _resp.code = 1;
  _resp.message = "验证通过";
  }
  else
  {
  _resp.code = 3;
  _resp.message = "帐号密码错误";
  }
  return _resp;
 }
 }
}

二、展示层实现

首先,添加css。

ninesky.web->content【右键】->添加->试样表,输入名称stylecontrol。

打开ninesky.web->app_start->bundleconfig.cs。

添加红框内代码。stylecontrol.css具体内容这里省略了。

其次,添加对ninesky.core的引用。

ninesky.web->引用【右键】->添加引用.。在引用管理器中选择 项目->解决方案->ninesky.core.

处理完这两项内容就继续具体内容了:

1、管理员身份验证类adminauthorizeattribute

adminauthorizeattribute继承自authorizeattribute,重写authorizecore方法,通过session["adminid"]来判断管理员是否已经登录,重写handleunauthorizedrequest方法来处理未登录时的页面跳转。

using system.web;
using system.web.mvc;

namespace ninesky.web.areas.control
{
 /// <summary>
 /// 管理员身份验证类
 /// </summary>
 public class adminauthorizeattribute : authorizeattribute
 {
 /// <summary>
 /// 重写自定义授权检查
 /// </summary>
 /// <returns></returns>
 protected override bool authorizecore(httpcontextbase httpcontext)
 {
  if (httpcontext.session["adminid"] == null) return false;
  else return true;
 }
 /// <summary>
 /// 重写未授权的 http 请求处理
 /// </summary>
 protected override void handleunauthorizedrequest(authorizationcontext filtercontext)
 {
  filtercontext.result = new redirectresult("~/control/admin/login");
 }
 }
}

ninesky.web->areas->control【右键】->添加->类,输入控制器名称homecontroller。

为homecontroller添加[adminauthorize]

2、管理员控制器ninesky.web->areas->control->controllers【右键】->添加->控制器。选择 mvc5 控制器 – 空, 输入控制器名称admin。

在控制器中引用ninesky.core、ninesky.core.generalninesky.web.areas.control.models命名空间。

添加私有变量private administratormanager adminmanager = new administratormanager();

为admincontroller添加[adminauthorize]

3.1 管理员登录

3.1.1 登录视图模型

ninesky.web->areas->control->models【右键】->添加->类,输入类名loginviewmodel。

namespace ninesky.web.areas.control.models
{
 /// <summary>
 /// 登录模型
 /// </summary>
 public class loginviewmodel
 {
 /// <summary>
 /// 帐号
 /// </summary>
 [required(errormessage = "必须输入{0}")]
 [stringlength(30, minimumlength = 4, errormessage = "{0}长度为{2}-{1}个字符")]
 [display(name = "帐号")]
 public string accounts { get; set; }

 /// <summary>
 /// 密码
 /// </summary>
 [datatype(datatype.password)]
 [required(errormessage = "必须输入{0}")]
 [stringlength(20,minimumlength =6, errormessage = "{0}长度{2}-{1}个字符")]
 [display(name = "密码")]
 public string password { get; set; }
 }
}

3.1.2 登录方法

在admincontroller中添加login()方法

/// <summary>
 /// 登录
 /// </summary>
 /// <returns></returns>
 [allowanonymous]
 public actionresult login()
 {
  return view();
 }

3.1.3 登录视图

login()方法上点【右键】->添加视图

模板选create,模型类选loginviewmodel ,选项选中引用脚本库。完成后代码

@model ninesky.web.areas.control.models.loginviewmodel

@{
 layout = null;
}

<!doctype html>

<html>
<head>
 <meta name="viewport" content="width=device-width" />
 <title>登录</title>
 @styles.render("~/content/controlcss")
 @scripts.render("~/bundles/modernizr")
</head>
<body>
 @scripts.render("~/bundles/jquery")
 @scripts.render("~/bundles/jqueryval")

 <div class="loginform">


 <div class="form-horizontal">
  <h2 class="text-primary">登录</h2>
  @using (html.beginform())
  {
  @html.antiforgerytoken()
  @html.validationsummary(true, "", new { @class = "text-danger" })
  <div class="form-group form-group-lg">
   @html.editorfor(model => model.accounts, new { htmlattributes = new { @class = "form-control", placeholder = "帐号" } })
   @html.validationmessagefor(model => model.accounts, "", new { @class = "text-danger" })
  </div>
  <div class="form-group form-group-lg">
   @html.editorfor(model => model.password, new { htmlattributes = new { @class = "form-control", placeholder = "密码" } })
   @html.validationmessagefor(model => model.password, "", new { @class = "text-danger" })
  </div>
  <div class="form-group form-group-lg">
   <input type="submit" value="登录" class="btn btn-default pull-right" />
  </div>
  }
 </div>

 </div>
</body>
</html>

在admincontroller中添加登录的处理方法public actionresult login(loginviewmodel loginviewmodel)

[allowanonymous]
 [validateantiforgerytoken]
 [httppost]
 public actionresult login(loginviewmodel loginviewmodel)
 {
  if(modelstate.isvalid)
  {
  string _passowrd = security.sha256(loginviewmodel.password);
  var _response = adminmanager.verify(loginviewmodel.accounts, _passowrd);
  if (_response.code == 1)
  {
   var _admin = adminmanager.find(loginviewmodel.accounts);
   session.add("adminid", _admin.administratorid);
   session.add("accounts", _admin.accounts);
   _admin.logintime = datetime.now;
   _admin.loginip = request.userhostaddress;
   adminmanager.update(_admin);
   return redirecttoaction("index", "home");
  }
  else if (_response.code == 2) modelstate.addmodelerror("accounts", _response.message);
  else if (_response.code == 3) modelstate.addmodelerror("password", _response.message);
  else modelstate.addmodelerror("",_response.message);
  }
  return view(loginviewmodel);
 }

4、注销

在admincontroller中添加注销的处理方法public actionresult logout()

/// <summary>
 /// 注销
 /// </summary>
 /// <returns></returns>
 public actionresult logout()
 {
  session.clear();
  return redirecttoaction("login");
 }

完工可以按f5测试了。

登录界面,输入帐号mzwhj 密码123456,登录成功。

登录成功界面。

=====================================================

代码见:https://ninesky.codeplex.com/sourcecontrol/latest

代码下载: 点击source code 点击download下载源文件。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。