一、 .net身份验证简介

  1.身份验证就是检测用户是否登录及所访问的资源是否有权限。当我们在访问一个受保护网络资源时,往往需要输入用户名、密码信息,或通过其他证书、第三方身份验证等方式。验证(Authenticate)是认证的过程 ,授权(Authorization)是权限检查。

获取权限,在.net中web.config 下提供了Window、Form、 Password、Basic、None身份验证,对于各种什么验证不做太多解释,可参考 http://www.cnblogs.com/sunnycoder/archive/2009/12/13/1623073.html。其中使用最广的是form身份验证,表单提交用户名和密码等信息进行验证。从.net 2.0有了基本的form身份验证后 ,from验证方式也不断在更新,从asp.net form(>=2.0)→membership→asp.net identity(>=4.5), 在到第三方Oauth2.0,微软的脚步是够快的...。今天主要介绍最基本的,2.0就有的老东西asp.net form身份验证,以后有时间会跟进 asp.net identity、Oauth2.0方面的文章。

二、.net form身份验证票据写入

  1.记得以前记录身份验证会记住session中。后来觉得有两方面不太妥:1)如果项目大了,服务器压力无疑很大。2)服务器意外中断,重启后,登录身份丢失。

  2.简单实现form身份验证。我将采用mvc5项目进行演示。 新建mvc5项目,如果选择个人用户身份验证将会使用asp.net identity身份验证,同时会添加AccountController。里面包括用户注册、登录等实例代码。由于本文不涉及asp.net identity不做太多解释。修改web.config   <authentication mode="Forms"></authentication > 在Login Action中写入信息  FormsAuthentication.SetAuthCookie("testUser", true);

此时最简单的from身份验证就ok啦,查看浏览器cookie信息,多了一个.aspxauth(可修改) 表示验证成功,默认cookie信息保存为30分钟。

  3.设置票据信息:上面一个示例只是简单的记录了一下用户已登录。如果要记录用户角色、设置cookie域、 过期时间等那就需要修改webconfig和写一个复杂的票据信息。

 // <summary>
/// 执行用户登录操作
/// </summary>
/// <param name="loginName">登录名</param>
/// <param name="expiration">登录Cookie的过期时间,单位:分钟。</param>
/// <param name="isPersisten">是否跨浏览器保存用户会话</param>
/// <param name="remeberMe">记住我</param>
public static void LoginIn(LoginViewModel user, int expiration, bool isPersisten = false, bool remeberMe = false)
{
var response = HttpContext.Current.Response;
var request = HttpContext.Current.Request; var roles = user.Roles;
var rolesStr = roles == null ? string.Empty : String.Join(",", roles.Select(p => p.RoleENName));
string userData = string.Format("{{Roles:'{0}',RemberMe:'{1}'}}", rolesStr, remeberMe.ToString()); FormsAuthenticationTicket authTicket =new FormsAuthenticationTicket( , user.UserName
, DateTime.Now
, remeberMe ? DateTime.Now.AddDays() : DateTime.Now.AddMinutes(expiration)
, isPersisten
, userData
);
string encryptedTicket = FormsAuthentication.Encrypt(authTicket); //加密
HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
response.Cookies.Add(authCookie);
var returnUrl = request.QueryString["ReturnUrl"];
response.Redirect(string.IsNullOrEmpty(returnUrl) ? FormsAuthentication.DefaultUrl : returnUrl); }

webconfig中除了 <authentication mode="Forms"></authentication >是必选项其余可选。我们可以再webconfig中设置cookie信息、资源限制等信息。

  <system.web>
<authentication mode="Forms">
<forms name="Test"
protection="All"
timeout="1"
loginUrl="/Auth/Login"
defaultUrl="~/"
slidingExpiration="false"/>
</authentication>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" />
</system.web>

三、.net 身份验证票据信息读取

  1.判断时机:判断用户是否登录,如果没登录就调至登陆页,登录则读取相关信息。这个用户判断是在httphandler 还是httpmodule中呢。答案显然只需用户首次访问时判断就可以了,不必每次请求action都判断。所以是在httpmodule。对于每个控制器继承一个父类BaseController,再重写OnActionExecuting这种做法会影响性能,不是一个明智的选择。

  2.web.config截取:

  <!--页面权限控制-->
<location path="Home/Index">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
<!--目录权限控制-->
<location path="Member">
<system.web>
<authorization>
<allow roles="Member"/>
<deny users="*"/>
</authorization>
</system.web>
</location>

  3.Aop拦截:在.net4.0中可以通过   [Authorize]特性判断用户是否登录,同时也可以自定义方法和特性控制。在global中通过下面方法控制

protected void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs e)

  4.读取票据信息:

       var cookieName= FormsAuthentication.FormsCookieName;
var cookie = Request.Cookies[cookieName]; if (cookie!=null)
{
// FormsAuthentication.GetAuthCookie();
var ticket= FormsAuthentication.Decrypt(cookie.Value);//读取
var value=JsonConvert.DeserializeObject(ticket.UserData);
}
void Application_AuthenticateRequest(object sender, EventArgs e)
{
//在安全模块建立起当前用户的有效的身份时,该事件被触发。在这个时候,用户的凭据将会被验证。 string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);//解密
}
catch (Exception ex)
{
return;
} string[] roles = authTicket.UserData.Split(new char[] { ',' });//如果存取多个角色,我们把它分解 FormsIdentity id = new FormsIdentity(authTicket); System.Security.Principal.GenericPrincipal principal = new System.Security.Principal.GenericPrincipal(id, roles);
Context.User = principal;//存到HttpContext.User中
}

  

四、参考

http://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.html

http://www.cnblogs.com/sunnycoder/archive/2009/12/13/1623073.html

http://www.360doc.com/content/12/0331/10/9525522_199530386.shtml

asp.net 身份验证-Form 身份验证的更多相关文章

  1. ASP.NET 中通过Form身份验证 来模拟Windows 域服务身份验证的方法

    This step-by-step article demonstrates how an ASP.NET   application can use Forms authentication to ...

  2. ASP.NET Form身份验证方式详解

    注:不会涉及ASP.NET的登录系列控件以及membership的相关话题, 我只想用比较原始的方式来说明在ASP.NET中是如何实现身份认证的过程.   ASP.NET身份认证基础 在开始今天的博客 ...

  3. ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证

    ASP.NET Identity除了提供基于Cookie的身份验证外,还提供了一些高级功能,如多次输入错误账户信息后会锁定用户禁止登录.集成第三方验证.账户的二次验证等,并且ASP.NET MVC的默 ...

  4. asp.net core 3.x 身份验证-1涉及到的概念

    前言 从本篇开始将围绕asp.net core身份验证写个小系列,希望你看完本系列后,脑子里对asp.net core的身份验证原理有个大致印象.至于身份验证是啥?与授权有啥联系?就不介绍了,太啰嗦. ...

  5. asp.net core 3.x 身份验证-3cookie身份验证原理

    概述 上两篇(asp.net core 3.x 身份验证-1涉及到的概念.asp.net core 3.x 身份验证-2启动阶段的配置)介绍了身份验证相关概念以及启动阶段的配置,本篇以cookie身份 ...

  6. 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权

    OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...

  7. asp.net 登陆验证 Form表单验证的3种方式 FormsAuthentication.SetAuthCookie;FormsAuthentication.RedirectFromLoginPage;FormsAuthenticationTicket

    我们在登陆成功后,使用下面的3种方法,都是同一个目的:创建身份验证票并将其附加到 Cookie, 当我们用Forms认证方式的时候,可以使用HttpContext.Current.User.Ident ...

  8. asp.net form身份认证不定时认证失败的问题 排查

    1.网站出现form认证不定时认证失败.登陆过后 每隔一会儿就需要重新登陆.首先检查的是form身份认证票据设置的时间(正常) 然后检查加密后的身份认证信息写入的cookie的失效时间(正常) 2.这 ...

  9. 2017年3月14日-----------乱码新手自学.net 之Authorize特性与Forms身份验证(登陆验证、授权小实例)

    有段时间没写博客了,最近工作比较忙,能敲代码的时间也不多. 我一直有一个想法,想给单位免费做点小软件,一切思路都想好了,但是卡在一个非常基础的问题上:登陆与授权. 为此,我看了很多关于微软提供的Ide ...

随机推荐

  1. 【转】C内存操作函数

    一.malloc/calloc 名称: Malloc/calloc 功能:  动态内存分配函数 头文件: #include <stdlib.h> 函数原形: void *malloc(si ...

  2. 最长上升子序列&&最长不下降子序列

    百练2757: 题目描述: 对于给定的序列,求出最长上升子序列的长度. 题目链接:http://bailian.openjudge.cn/practice/2757 解题思路 一.动态规划 1. 找子 ...

  3. Uva 11806 拉拉队

    题目链接:https://uva.onlinejudge.org/external/118/11806.pdf 题意: n行m列的矩阵上放k个棋子,其中要求第一行,最后一行,第一列,最后一列必须要有. ...

  4. UIView的层次调整,及子view布局模式自动布局模式(停靠模式)

    UIView*view1=[[UIView alloc]initWithFrame:CGRectMake(10,30,300,30)]; view1.backgroundColor=[UIColor ...

  5. 2295: KMP模式匹配 一(串)

    2295: KMP模式匹配 一(串) 时间限制: 1 Sec  内存限制: 128 MB提交: 210  解决: 97[提交][状态][讨论版][命题人:外部导入] 题目描述 求子串的next值,用n ...

  6. object dection资源

    https://handong1587.github.io/deep_learning/2015/10/09/object-detection.html

  7. Oracle字符编码与汉字存储长度的处理

    执行如下语句,查看汉字在数据库中所占的字节: select vsize('汉') from dual; 一般情况下,得到的结果大部分为值:2 或 3 一般linux下安装oracle数据库,默认字符编 ...

  8. 前端JavaScript之DOM节点操作

    1.HTML DOM是啥 Document Object Model:定义了访问和操作HTML文档的标准方法,把HTML文档呈现为带有元素,属性和文本的树状结构 2.解析过程 HTML加载完毕,渲染引 ...

  9. 1.Spring Cloud初相识--------简单项目搭建

    开发工具:STS 代码下载链接:GitHub管理项目 前言: Springcloud 算是当前比较火的技术,一套微服务架构的技术. 我个人对微服务的理解为: 服务可以代表service,微服务就是小的 ...

  10. OA上传和编辑数据

    1.VO:value object值对象.通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已.但应是抽象出的业务对象,可以和表对应,也可以不,这根据业务的需要. 2. String[]类型打 ...