asp.net mvc中实现Forms身份验证身份验证流程的实例

黄舟

黄舟

2018-05-14

4658人浏览

原创

本篇文章主要介绍了asp.net mvc中forms身份验证身份验证流程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

验证流程

一、用户登录

1、验证表单:ModelState.IsValid
2、验证用户名和密码:通过查询数据库验证
3、如果用户名和密码正确,则在客户端保存Cookie以保存用户登录状态:SetAuthCookie
    1):从数据库中查出用户名和一些必要的信息,并把额外信息保存到UserData中
 2):把用户名和UserData保存到 FormsAuthenticationTicket 票据中
 3):对票据进行加密 Encrypt
 4):将加密后的票据保存到Cookie发送到客户端
4、跳转到登录前的页面
5、如果登录失败,返回当前视图

二、验证登录

1、在Global中注册PostAuthenticateRequest事件函数,用于解析客户端发过来的Cookie数据
 1):通过 HttpContext.Current.User.Identity 判断用户是否登录(FormsIdentity,IsAuthenticated,AuthenticationType)
 2):从HttpContext 的Request的Cookie中解析出Value,解密得到 FormsAuthenticationTicket 得到UserData
2、角色验证
 1):在Action加入 Authorize特性,可以进行角色验证
 2):在 HttpContext.Current.User 的 IsInRole 方法进行角色认证(需要重写)

一、用户登录

1、设置web.config

设置重定向登录页面

<system.web><authentication>
  <forms></forms></authentication></system.web>

注释掉

<modules>
  <!--<remove name="FormsAuthentication" />-->
</modules>

2、登陆的验证中控制器

常用表单的PHP验证类
常用表单的PHP验证类

常用表单的PHP验证类

下载

控制器中加“[Authorize]”修饰的方法拒绝匿名。

 public class UserInfoController : Controller //控制器
 {
 //身份验证过滤器
  [Authorize]
  public ActionResult Index()
  {
   return View();
  }
 }

控制器中登录

   /// <summary>
  /// 用户登录
  /// </summary>
  /// <returns></returns>
  public ActionResult login()
  {
   return View();
  }  
  [HttpPost]
  public ActionResult login(loginModels login) {
   if (ModelState.IsValid)
   {
    var model = db.Admininfo.FirstOrDefault(a => a.AdminAccount == login.AdminAccount && a.AdminPwd == login.AdminPwd);
    if (model != null)
    {
     //存入票据(用户登录的时候去存信息,如果有信息直接去登录)
     var dtoModel = new Users
     {
      id = model.id,
      AdminPwd = model.AdminPwd,
      AdminAccount=model.AdminAccount
     };
     //调用
     SetAuthCookie(dtoModel);
     //获取登录地址
     var returnUrl = Request["ReturnUrl"];
     //判断登录地址是不是空值
     if (!string.IsNullOrWhiteSpace(returnUrl))
     {      
      return Redirect(returnUrl);
     }
     else
     {
      //return RedirectiToAction
      return Redirect("/Home/index");
     }

    }
    else
    {
     ModelState.AddModelError("", "账号密码不对");
     return View(login);
    }
   }
   else
   {
    ModelState.AddModelError("", "输入的信息有误");
    return View(login);

   }

对登录账号进行cookie

  /// <summary>
  /// 对登录账号进行cookie
  /// </summary>
  /// <param>
  public void SetAuthCookie(Users loginModel) {
   //1、将对象转换成json
   var userdata = loginModel.ToJson();
   //2、创建票据FormsAuthenticationTicket
   FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2,"loginUser",DateTime.Now,DateTime.Now.AddDays(1), false, userdata);
   //对票据进行加密 
   var tickeEncrypt = FormsAuthentication.Encrypt(ticket);
   //创建Cookie,定义
   HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, tickeEncrypt);
   cookie.HttpOnly = true;
   cookie.Secure = FormsAuthentication.RequireSSL;
   cookie.Domain = FormsAuthentication.CookieDomain;
   cookie.Path = FormsAuthentication.FormsCookiePath;
   cookie.Expires = DateTime.Now.Add(FormsAuthentication.Timeout);
   //先移除cookie,在添加cookie
   Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
   Response.Cookies.Add(cookie);
  }

3、Models中添加模型文件

 public class loginModels
 {
  /// <summary>
  /// 账号
  /// </summary>
  [DisplayName("账号")]
  [Required(ErrorMessage = "账号不能为空")] 
  public string AdminAccount { get; set; }
  /// <summary>
  /// 密码
  /// </summary>
  [DisplayName("密码")]
  [Required(ErrorMessage = "密码不能为空")]
  public string AdminPwd { get; set; }
 }

4、Views中 Login 代码:

复制代码 代码如下:

@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { 
@class = "form-horizontal", role = "form" }))

5、Global设置

protected void Application_AuthenticateRequest(object sender, EventArgs e)
  {
   //1、通过sender获取http请求
   // HttpApplication app = new HttpApplication();//实例化
   HttpApplication app = sender as HttpApplication;
   //2、拿到http上下文
   HttpContext context = app.Context;
   //3、根据FormsAuthe,来获取cookie
   var cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName];
   if (cookie != null)
   {
    //获取cookie的值
    var ticket = FormsAuthentication.Decrypt(cookie.Value);
    if (!string.IsNullOrWhiteSpace(ticket.UserData))
    {
     //把一个字符串类别变成实体模型
     var model = ticket.UserData.ToObject<admininfoviewmodel>();
     //var acount = model.AdminAccount; //获取账号
     context.User = new MyFormsPrincipal<admininfoviewmodel>(ticket, model);
     //MyFormsPrincipal.Identity = new FormsIdentity(ticket);
     // MyFormsPrincipal.userdata;

    }
   }
  }</admininfoviewmodel></admininfoviewmodel>

6、退出登录

控制器中

  /// <summary>
  /// 退出登录
  /// </summary>
  public ActionResult loginout()
  {
   //删除票据
   FormsAuthentication.SignOut();
   //清除cookie
   Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddDays(-1);
   Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
   return RedirectToAction("Index", "Home");
 
  }

View跳转链接

@Html.ActionLink("安全退出","loginout","Users")

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
墨刀AI提示词教学
墨刀AI提示词教学

本合集由PHP中文网精心整理,为您提供全面的墨刀AI提示词教学。内容涵盖高质量原型撰写公式与实操窍门,助您轻松掌握AI设计工具。无论是零基础入门还是进阶技巧,都能让您快速上手,大幅提升产品设计与协作效率。

2026.08.04

11

21

墨刀AI完整入门
墨刀AI完整入门

PHP中文网为您倾力打造墨刀AI保姆级入门指南完整版!本合集从零基础讲起,涵盖AI生成原型、提示词优化、图片转原型及多轮对话等核心功能。无论您是新手还是进阶用户,都能轻松掌握产品设计全流程。快来PHP中文网,一键解锁高效设计技巧,让想法即刻成型!

2026.08.04

8

20

墨刀AI进阶技巧
墨刀AI进阶技巧

本合集由PHP中文网精心整理,为您提供墨刀AI核心进阶策略指南。内容涵盖高效提示词写作、原型智能生成与微调、结构化导图制作及行业分析报告输出等实战技巧。助您轻松掌握AI设计工具,大幅提升产品设计与团队协作效率。

2026.08.04

10

14

火山引擎实名认证失败怎么办
火山引擎实名认证失败怎么办

火山引擎实名认证失败可能与证件信息填写错误、姓名或企业信息不一致、证件照片不清晰、营业执照状态异常、手机号验证失败或审核资料不完整有关。本专题整理个人认证、企业认证、资料上传、审核退回、重新提交和认证不通过的常见处理方法。

2026.08.04

5

10

火山引擎域名备案流程详解
火山引擎域名备案流程详解

火山引擎域名备案适合需要在火山引擎云服务器、对象存储、CDN或网站服务上绑定域名的用户参考。本专题整理备案入口、账号实名认证、备案类型选择、主体信息填写、网站信息提交、资料上传、初审核验、管局审核和备案失败排查,帮助用户完成网站上线前的备案流程。

2026.08.04

1

10

火山引擎DNS解析配置步骤
火山引擎DNS解析配置步骤

使用火山引擎DNS解析网站域名时,需要确认域名已完成管理接入,并正确配置服务器IP、CNAME地址或验证记录。本专题整理域名添加、记录类型选择、TTL设置、解析状态检查、备案和访问测试等流程,适合新手搭建网站时参考。

2026.08.04

3

10

火山引擎对象存储使用教程
火山引擎对象存储使用教程

火山引擎对象存储适合用于网站图片、视频文件、备份数据、静态资源和应用附件管理。本专题整理TOS控制台入口、存储桶创建、地域选择、权限设置、文件上传、访问链接生成、CDN加速、费用查看和常见上传或访问失败问题,帮助用户快速掌握对象存储基础操作。

2026.08.04

1

10

火山引擎云服务器使用教程
火山引擎云服务器使用教程

火山引擎云服务器使用教程适合第一次购买、部署和管理云服务器的用户参考。本专题整理控制台入口、实例创建、地域和配置选择、系统镜像设置、安全组放行、远程连接、网站部署、续费计费和常见连接失败问题,帮助用户快速完成云服务器基础使用流程。

2026.08.04

5

10

火山引擎API Key绑定大模型教程
火山引擎API Key绑定大模型教程

火山引擎API Key怎么绑定大模型适合需要在火山方舟、应用后台、脚本工具或AI编程软件中调用模型的开发者参考。本专题整理控制台服务开通、API Key创建、模型权限检查、模型ID选择、Base URL填写、调用测试和鉴权失败排查,帮助用户完成从密钥到模型调用的配置流程。

2026.08.04

2

10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ASP.NET参考手册
ASP.NET参考手册

共0课时 | 0.6万人学习

传播智客ASP.NET中级系列视频教程
传播智客ASP.NET中级系列视频教程

共33课时 | 7.2万人学习