从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程
从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程
用户登录与权限验证是网站不可缺少的一部分功能,asp.net MVC4框架内置了用于实现该功能的类库,只需要简单搭建即可完成该功能.
下面详细介绍该功能的完成方法,尾部有实例源码下载,希望可以给刚开始接触MVC的朋友做个参考.
第一步:给VS安装MVC4框架
VS2012自带MVC4框架,其他版本可以使用独立安装包进行安装,这里就不讨论了,本例使用VS2013创建,.NET4.0+MVC4
第二步:创建MVC4网站项目
选择文件-新建-项目,按下图示例创建一个空的MVC网站


第三步:配置web.config,启用Form验证.
打开根目录下的web.config,在<system.web>节点下插入一下代码,启用Form验证并指定默认登录页面
<authentication mode="Forms">
<forms loginUrl="/Home/Login" timeout="2880"/>
</authentication>
第四步:创建所需要文件
本例需要创建以下文件:
Model文件夹下LoginModel.cs
Controllers文件夹下HomeController.cs
View下创建文件下Home,文件夹下创建文件:
Index.cshtml
Login.cshtml
Show.cshtml
Edit.cshtml
Add.cshtml
文件结构如下图所示:

第五步:填充LoginModel代码

public class LoginModel
{
[Display(Name="用户名")]
[Required(ErrorMessage="用户名不能为空")]
public string UserName { get; set; }
[Display(Name="密码")]
[Required(ErrorMessage="密码不能为空")]
[DataType(DataType.Password)]
[RegularExpression(@"^\w+$", ErrorMessage = "密码格式有误,只能是字母数字或者下划线")]
public string Password { get; set; }
[Display(Name="记住登陆?")]
public bool RememberMe { get; set; }
public string Login()
{
//该方法应从数据库中对比用户名和密码,并取得用户权限列表
//这里为了简单直接对比字符串并返回权限列表,返回NULL则说明用户名或者密码错误
//权限列表即为用,分割的权限名称
string result = null;
if (this.UserName == "guest" & this.Password == "guest")
result = "Add";
if (this.UserName == "admin" & this.Password == "admin")
result = "Add,Edit";
return result;
}
}

复制上面代码到类中时VS的智能感知会提示你缺少以下命名空间,添加上即可
using System.ComponentModel.DataAnnotations;
第五步:填充HomeControll代码

public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
ViewBag.Info = "该页面不含权限注解,所有人均可访问.";
return View();
}
[Authorize(Roles = "Edit")] //该注解表示只有包含Edit权限的用户才可以访问
public ActionResult Edit()
{
ViewBag.Info = "该页面需要包含Edit权限的人才可访问.";
return View();
}
[Authorize(Roles = "Add")] //该注解表示只有包含Add权限的用户才可以访问
public ActionResult Add()
{
ViewBag.Info = "该页面需要包含Add权限的人才可访问.";
return View();
}
[Authorize(Roles = "Add,Edit")] //该注解表示只有包含Add权限的用户才可以访问
public ActionResult Show()
{
ViewBag.Info = "该页面需要包含Edit或者Add权限的人才可访问.";
return View();
}
public ActionResult Login(LoginModel model)
{
return View();
}
[HttpPost] //该注解表示只接收Post数据
[ValidateAntiForgeryToken]//该注解可以防止跨站攻击
[ActionName("Login")]//该注解可以更改路由中Action名称
public ActionResult LoginCheck(LoginModel model)
{
if (!ModelState.IsValid)
{
//用户输入服务端验证,此处处理验证不通过的提示代码 本例略过
return View();
}
string result = model.Login();
if (result == null)
{
//用户名或者密码不正确的提示代码 本例略过
return View();
}
else
{
//用户登陆核心代码
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1,
model.UserName,
DateTime.Now,
DateTime.Now.AddHours(240),//记住密码的时间
model.RememberMe,//是否保存cookie 记住密码
result //获取的用户权限列表 用逗号分割的字符串
);
string encryptedTickt = FormsAuthentication.Encrypt(authTicket);
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTickt);
Response.Cookies.Add(authCookie);
Response.Redirect("/Home", true);
ActionResult empty = new EmptyResult();
return empty;
}
return View();
}

复制以上代码,会提示添加以下命名空间:
using ChengChenXu.MVC4_Login_Demo.Models; //项目Model命名空间 using System.Web.Security;
第六步:填充View代码,下面代码仅展示<Body>标签内部的内容,页头没有展示(源码中完全).
Index.cshtml
<h1>@ViewBag.Info</h1><br />
<a href="/home/login">登陆</a><br />
<p>以下链接 登陆后才可以访问 未登陆时如果点击则会跳转到登陆页</p>
<a href="/home/add">添加页面</a><br />
<a href="/home/edit">编辑页面</a><br />
<a href="/home/show">查看页面</a><br />
Add.cshtml Edit.cshtml Show.cshtml 三个文件代码一致
<h1>@ViewBag.Info</h1>
<a href="/home">返回</a><br />
Login.cshtml 该文件首先要在顶部添加一行代码,表示是一个强类型View
@model ChengChenXu.MVC4_Login_Demo.Models.LoginModel
页面代码:

@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.LabelFor(model=>model.UserName)
@Html.TextBoxFor(model => model.UserName)
<br />
@Html.LabelFor(model=>model.Password)
@Html.PasswordFor(model => model.Password)
<br />
@Html.LabelFor(Model=>Model.RememberMe)
@Html.CheckBoxFor(model=>model.RememberMe)
<br />
<input type="submit" class="submit" tabindex="3" value="登录" />
}

第七步:修改根目录下Global.asax的代码,添加权限处理代码,把下面两个方法复制添加到Global文件即可

public MvcApplication()
{
AuthorizeRequest += new EventHandler(MvcApplication_AuthorizeRequest);
}
void MvcApplication_AuthorizeRequest(object sender, EventArgs e)
{
var id = Context.User.Identity as FormsIdentity;
if (id != null && id.IsAuthenticated)
{
var roles = id.Ticket.UserData.Split(',');
Context.User = new GenericPrincipal(id, roles);
}
}

复制好后会提示缺少以下命名空间:
using System.Web.Security; using System.Security.Principal;
完成好之后全部实例就完成了,运行以下试试吧.
主页为/Home 无需权限
登录页为/Home/Login 无需权限
添加页为/Home/Add 需要Add权限
展示页为/Home/Show 需要Edit或者Add权限
编辑页为/Home/Edit 需要Edit权限
内置了两个账号
账号 密码 权限
guest guest "add"
admin admin "add,edit"
运行结果:
如果直接访问除了Home和Login页面之外的页面(需要权限的页面) 则会跳转到Login页面
guest账号可以访问Add Show页面
admin账号可以访问Add Edit Show页面
锦上添花:
1 自动跳转到登录页的时候URL会有一个ReturnUrl参数记录跳转前的页面,可以捕捉该页面登录后跳回
2 MVC支持客户端验证,需要js文件支持,这样客户端就不再需要写js代码进行输入验证了.本例不再展示了,请自行搜索.
本博文转自我的博客:http://chengchenxu.com/Article/show/14/
源码下载:http://chengchenxu.com/ueditor/net/upload/file/20180305/6365584952537468509926479.rar
从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程的更多相关文章
- 学习MVC之租房网站(六)-用户登录和权限控制
在上一篇<学习MVC之租房网站(五)-权限.角色.用户管理>完成了权限.角色.用户的增删改查,现在将基于前面完成的内容,进行后台用户登录和权限控制功能的开发. 一.用户登录 用户登录涉及到 ...
- Asp.NET WebApi+Redis实现单用户登录实战演练
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...
- ASP.NET MVC View 和 Web API 的基本权限验证
ASP.NET MVC 5.0已经发布一段时间了,适应了一段时间,准备把原来的MVC项目重构了一遍,先把基本权限验证这块记录一下. 环境:Windows 7 Professional SP1 + Mi ...
- .NET跨平台之旅:ASP.NET Core从传统ASP.NET的Cookie中读取用户登录信息
在解决了asp.net core中访问memcached缓存的问题后,我们开始大踏步地向.net core进军——将更多站点向asp.net core迁移,在迁移涉及获取用户登录信息的站点时,我们遇到 ...
- Java SSH框架系列:用户登录模块的设计与实现思路
1.简介用户登录模块,指的是根据用户输入的用户名和密码,对用户的身份进行验证等.如果用户没有登录,用户就无法访问其他的一些jsp页面,甚至是action都不能访问.二.简单设计及实现本程序是基于Jav ...
- ASP.NET MVC4框架揭秘 源代码下载
http://files.cnblogs.com/artech/asp.net.mvc.4.samples.rar
- asp.net MVC4 框架揭秘 读书笔记系列3
IIS/ASP.net管道 本节全部用图形表示便于理解和记忆 1.3.1 IIS5.x与asp.net 1.3.2 IIS 6.0与asp.net 1.3.3 IIS7.0与asp.net 基于IIS ...
- asp.net MVC4 框架揭秘 读书笔记系列2
1.2 MVC 变体 MVC 是一种Pattern 另外一种说法是ParaDigm 范例 模式和范例的区别在于前者可以应用到具体的应用上,而后者则仅仅提供一些指导方针 1.2.1 MVP Model ...
- asp.net MVC4 框架揭秘 读书笔记系列1
1.1 传统MVC 名词解释 Autonomous View. AV. 自制视图 GUI图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式 ...
随机推荐
- 001-软件架构概览、maven补充【分包工程、合并包、web容器插件】、git补充
一.整体概述 1.1.共性问题 技术瓶颈.不成体系.不能实际使用.不能落地.无法入门 1.2.目标-软件架构 专注于构建:高可扩展.高性能.大数据量.高并发.分布式的系统架构. 各项技术.组合构建分布 ...
- vlc的流输出功能
vlc的流输出功能 流输出功能,可以将vlc读取到的流,输出到文件或者通过网络发送,客户端可以使用http.rtp.rtsp等协议访问,还可以进行转码等操作. 参考http://wiki.videol ...
- php上传文件夹
用过浏览器的开发人员都对大文件上传与下载比较困扰,之前遇到了一个php文件夹上传下载的问题,无奈之下自己开发了一套文件上传控件,在这里分享一下.希望能对你有所帮助. 以下是实例的部分脚本文件与代码: ...
- Linux批量处理常用方式
批量处理思路在工作中使用的频率比较高,比如批量清理进程.批量删除文件.批量机器执行脚本等. 一.批量清理带java字样的进程 方式1:使用shell while语法. ${line}; done sh ...
- const成员变量
#include <iostream> using namespace std; class A { public: A(int size) : SIZE(size) {}; privat ...
- VS2012编译php扩展
注意:用VS2015来做会比较好! 开发前准备工作:cygwinvisual studio 2012php编译后的程序 使用的是 xampp集成安装包,所以编译后的程序路径为D:\xampp ...
- Code First EF 多对多时拆分两个一对多
(*)多对多中还可以为中间表建立一个实体方式映射.当然如果中间关系表还想有其他字段,则要必须为中间表建立实体类(中间表和两个表之间就是两个一对多的关系了). demo项目 WebApp22 GitHu ...
- maven-1-是什么
背景 1.1. 场景 假如你正在Eclipse下开发两个Java项目,姑且把它们称为A.B,其中A项目中的一些功能依赖于B项目中的某些类,那么如何维系这种依赖关系的呢? 很简单,这不就是跟我们之前写程 ...
- 【HTML】常用的标签学习(2)
现在的使用的html语言都是h5,但是h5也是从h4继承发展来的,所以h4的标签我们也要学习,然后加上h5新增的标签,那么html这门语言才算学习完毕.上次学习了h4的一些常用标签,今天学习h4剩下的 ...
- 华三F100系列、华为USG6300系列防火墙 策略路由配置实例
策略路由,是一种比基于目标网络进行路由更加灵活的数据包路由转发机制,路由器将通过路由图决定如何对需要路由的数据包进行处理,路由图决定了一个数据包的下一跳转发路由器. 策略路由的应用: 1.可以不仅仅依 ...