ASP.NET Forms 认证

Forms认证基础

  1. HTTP是无状态的协议,也就是说用户的每次请求对服务器来说都是一次全新的请求,服务器不能识别这个请求是哪个用户发送的。

  2. 那服务器如何去判断一个用户的请求呢?

  3. 答案是在每次请求发送时,附带一些其他的信息来识别用户的请求

  4. 对于Forms认证,每次的请求都携带同样的cookie信息,将此信息发送给服务器,这样服务器就可以识别这个请求到底是哪个用户的。


ASP.NET Forms 认证基础

  1. ASP.NET Request.IsAuthenticated为true 代表此用户已经登陆

  2. 使用 HttpContext.User 来表用用户的信息


ASP.NET Forms 认证过程

  1. ASP.NET 检查当前的请求,并根据Web.config中配置的认证方式去构造HttpContext.User 供后续处理

  2. 后续可以通过判断HttpContext.User 信息来识别用户信息


ASP.NET Forms 登陆与注销

  1. 使用vs2017 新建一个MVC程序,不进行身份验证

  2. 在Web.config 的system.web 配置节新增Forms认证信息,内容如下

    <authentication mode="Forms" >
<forms cookieless="UseCookies" name="FormsCookie" loginUrl="~/Home/Index.cshtml"></forms>
</authentication>
  1. 我们使用 Request.IsAuthenticated 来判断用户是否登陆,我们来做一个登陆页面
<div>
<fieldset>
<legend>用户登陆</legend>
<form action="/Home/Login" method="post">
用户名:<input type="text" name="loginName" style="width:200px;" />
密 码:<input type="password" name="loginPwd" style="width:200px" />
<input type="submit" value="登录" />
</form>
</fieldset>
</div>
  1. 后台验证密码成功后跳转到欢迎的页面
        public ActionResult Login(string loginName,string loginPwd)
{
if (string.IsNullOrEmpty(loginName) || string.IsNullOrEmpty(loginPwd))
return Redirect("Index");
if (loginName == "Admin" && loginPwd == "Admin")
{
FormsAuthentication.SetAuthCookie(loginName, true);
return RedirectToAction("Index", "Welcome");
}
else
{
return Redirect("Index");
}
}
  1. 在欢迎页面如果已登录显示用户名,如果未登录显示登录地址进行登录
<div>
<fieldset>
<legend>
欢迎
</legend>
@if (Request.IsAuthenticated)
{
@: 你好 @Context.User.Identity.Name
}
else
{
<div>
还未登录,请进行 <a href="/Home/Index">登录</a>
</div>
}</fieldset>
</div>

总结

可以看到我们在验证完用户名和密码后,只是调用了 FormsAuthentication.SetAuthCookie(loginName, true); 执行完之后ASP.NET 就可以识别此用户后续的请求。这个方法帮我们做了如下流程:

用户登录流程

  1. 根据用户名创建一个FormsAuthenticationTicket对象

  2. 调用FormsAuthenticatin.Encrypt() 进行加密

  3. 根据加密结果创建名称为 FormsCookie (来自Web.config中的配置) 的cookie

  4. 将此cookie 写入Response 返回给浏览器

  5. 浏览器在进行后续请求时会携带此cookie到服务端。

每次请求时的认证流程

  1. 浏览器在发送请求时携带cookie信息

  2. FormsAuthenticationModule 读取cookie

  3. 从cookie中解析出FormsAuthenticationTicket 对象,过期的对象将被忽略

  4. 根据FormsAuthenticationTicket 对象构造 FormsIdentity对象并设置HttpContext.User

  5. ASP.NET 程序后续 HttpContext.User来判断用户信息

到此我们已经完成正整个认证流程。


更多详细内容请参见大神 Fish Li (李奇峰)

ASP.NET Forms 认证流程的更多相关文章

  1. asp.net forms认证

    工作中遇到的asp.net项目使用forms认证.以前虽然用过,但其原理并不了解,现在甚至对什么是form认证也完全不知道了.对一样东西如果不清楚其原理,不知其所以然,那么死记硬背是无济于事的. as ...

  2. Asp.net forms认证注意事项

    1.N台服务器配置文件的相关配置要一致 <authentication mode="Forms"> <forms timeout="3600" ...

  3. 细说ASP.NET Forms身份认证

    阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份 ...

  4. 在asp.net WebAPI 中 使用Forms认证和ModelValidata(模型验证)

    一.Forms认证 1.在webapi项目中启用Forms认证 Why:为什么要在WebAPI中使用Forms认证?因为其它项目使用的是Forms认证. What:什么是Forms认证?它在WebAP ...

  5. 简单的ASP.NET Forms身份认证

    读了几篇牛人的此方面的文章,自己也动手做了一下,就想有必要总结一下.当然我的文章质量自然不能与人家相比,只是写给从没有接触过这个知识点的朋友. 网站的身份认证我以前只知道session,偶然发现一些牛 ...

  6. IE11下ASP.NET Forms身份认证无法保存Cookie的问题

    IE11下ASP.NET Forms身份认证无法保存Cookie的问题 折腾了三四天,今天才找到资料,解决了. 以下会转贴,还没来得及深究,先放着,有空再学习下. ASP.NET中使用Forms身份认 ...

  7. asp.net权限认证:Forms认证

    asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...

  8. C# ASP.NET Forms身份认证

    原文:https://www.cnblogs.com/kyo-lynn/p/3418577.html 原文:https://www.cnblogs.com/fish-li/archive/2012/0 ...

  9. 【转】权限管理学习 一、ASP.NET Forms身份认证

    [转]权限管理学习 一.ASP.NET Forms身份认证 说明:本文示例使用的VS2017和MVC5. 系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单 ...

随机推荐

  1. 编程学习笔记(第三篇)面向对象技术高级课程:绪论-软件开发方法的演化与最新趋势(3)软件开发的现状、UML扩展

    一.软件开发的现状 软件领域正在发生一个巨变,特别是近几年来,软件领域正在发生翻天覆地的变化. 这一变化主要以这个云 + 端大数据, 这些是随着目前最先进的一些技术的产生而产生的. 随着这些新的技术以 ...

  2. abp项目中无法使用HttpContext.Current.Session[""]的问题

    web项目Global.asax.cs中加入如下代码 public override void Init() { this.PostAuthenticateRequest += (sender, e) ...

  3. R及Rstudio 的使用建议

    对于新人来说,进行R的学习时,通常会发现一般的教程都是让大家在交互环境下使用R. 但是这有一些缺点,比如在交换环境下,出现错误是难以撤销的,有的时候甚至需要重头做起.尤其是在Rstudio的交互环境下 ...

  4. JS高级- OOP-ES5

    1. OOP 面向对象三大特点: 封装,继承,多态 封装: 问题: 构造函数可重用代码和结构定义,但无法节约内存 为什么: 放在构造函数内的方法定义,每new一次,都会反复创建副本——浪费内存 解决: ...

  5. css兼容技巧

    CSS兼容常用技巧 请尽量用xhtml格式写代码,而且DOCTYPE影响 CSS 处理,作为W3C标准,一定要加DOCTYPE声明. 1.div的垂直居中问题 vertical-align:middl ...

  6. exec函数

    概念 当进程调用一种exec函数时,该进程执行的程序完全替换为新程序,新程序从main函数开始执行.调用exec并不创建新进程,所以前后的进程ID并未改变.exec只是用磁盘上的一个新程序替换了当前进 ...

  7. BitMap的简单实现

    面试结束的这些日子好几次接触到BitMap这个东西.到底是啥呢,究其原因就是虽然它的使用条件较为苛刻,但是它对应的时间复杂度和空间复杂度真的是惊人的好. 首先是根据其思想先写了一个比较差的实现代码: ...

  8. 腾讯云 centos 一键安装nginx环境

    这里测试centos版本为7.4 进入命令行直接敲入一下代码 $ yum install nginx 根据提示 进行确认 下一步 即可安装完毕: 服务器默认根目录为 : /usr/share/ngin ...

  9. javase jdk 环境变量 涵义

    jdk环境变量配置:path:jdk安装所在目录下的bin路径-->因为环境变量path下放置的是操作系统执行的.exe文件,jdk中bin中放的是可执行的.exe文件,所以要把这个路径放置到p ...

  10. ThinkPHP3.2.3:使用模块映射隐藏后台真实访问地址

    例如:项目应用目录/Application下模块如下,默认后台模块为Admin 现在需要修改后台模块的访问地址,以防被别有用心的人很容易就猜到,然后各种乱搞... (在公共配置文件/Applicati ...