Asp.net中使用身份验证票进行身份验证

作者:翅膀的初衷 来源:本站原创 发布时间:2013-09-13 查看数:62575

FormsAuthenticationTicket(身份验证票)早在.Net 1.0的年代就已经存在,位于命名空间System.Web.Security中,做为asp.net中极为实用的功能之一,一直深受笔者喜欢,但是在实际开发中,发现不少asp.net开发者可能因为不太熟悉的缘故(抑或是其它)较少使用,于是在这里给新手及以前未关注过的开发者介绍一下FormsAuthenticationTicket,同时也做为自己使用时的一个资料查询备份!

一:配置Forms验证
打开Web.config,在configuration/system.web找到<authentication mode="Windows" /> 配置,将属性mode的值由Windows改为Forms,如果不存在,则手动创建一个。然后在增加子节点forms,完整配置如下:

1 <authentication mode="Forms">
2   <forms name=".JN" loginUrl="/login.aspx" timeout="30"path="/"></forms>
3 </authentication>

其中<authentication mode="forms">表示本应用程序采用Forms验证方式。可选值有:

+-----------------------------------+-----------------------------------------------------------------------------------+ | 特性 | 说明 | +-----------------------------------+-----------------------------------------------------------------------------------+ | mode | 必需的特性。 | | | | | | 指定应用程序的默认身份验证模式。 此特性可以为下列值之一。 | | | | | | 值说明 | | | | | | Windows将 Windows 验证指定为默认的身份验证模式。 将它与以下任意形式的 | | | Microsoft Internet 信息服务 (IIS) 身份验证结合起来使用:基本、摘要、集成 Windows | | | 身份验证 (NTLM/Kerberos) | | | 或证书。 在这种情况下,您的应用程序将身份验证责任委托给基础 IIS。 | | | | | | Forms将 ASP.NET 基于窗体的身份验证指定为默认身份验证模式。 | | | | | | Passport将 Microsoft Passport Network 身份验证指定为默认身份验证模式。 | | | | | | None不指定身份验证。 您的应用程序仅期待匿名用户,否则它将提供自己的身份验证。 | | | | | | 默认值为 Windows。 | +-----------------------------------+-----------------------------------------------------------------------------------+

forms标签中的name表示指定要用于身份验证的cookie name。默认情况下,name的值是.ASPXAUTH。
loginUrl为登录页地址,所有未授权的页面都会跳转到该地址!
其完整配置属性与值如下:

+-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | 特性 | 说明 | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | cookieless | 可选特性。 | | | | | | 定义是否使用 Cookie 以及 Cookie 的行为。 | | | | | | 此特性可以为下列值之一。 | | | | | | 注意 | | | | | | 在启用了 AJAX 的 ASP.NET Web 站点中,对 cookieless 特性使用默认值 UseCookies。ASP.NET AJAX 客户端脚本库不支持使用编码到 URL 中的 Cookie 的设置。 | | | | | | 值说明 | | | | | | UseCookies指定无论在什么设备上都始终使用 Cookie。 | | | | | | UseUri指定从不使用 Cookie。 | | | | | | AutoDetect如果设备配置文件支持 Cookie,则指定使用 Cookie;否则不使用 Cookie。对于已知支持 Cookie 的桌面浏览器,将使用探测机制来尝试在启用 Cookie 时使用 Cookie。如果设备不支持 | | | Cookie,将不使用探测机制。 | | | | | | UseDeviceProfile如果浏览器支持 Cookie,则指定使用 Cookie;否则不使用 Cookie。对于支持 Cookie 的设备,不尝试通过探测来确定是否已启用 Cookie 支持。 | | | | | | 此特性是 .NET Framework 2.0 版中的新特性。 | | | | | | 默认值为 UseDeviceProfile. | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | defaultUrl | 可选特性。 | | | | | | 定义在身份验证之后用于重定向的默认 URL。 | | | | | | 此特性是 .NET Framework 2.0 版中的新特性。 | | | | | | 默认值为 "default.aspx"。 | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | domain | 可选特性。 | | | | | | 指定在传出 Forms 身份验证 Cookie 中设置的可选域。 此设置的优先级高于 httpCookies 元素中使用的域。 | | | | | | 此特性是 .NET Framework 2.0 版中的新特性。 | | | | | | 默认值为空字符串 ("")。 | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | enableCrossAppRedirects | 可选特性。 | | | | | | 表明是否将通过身份验证的用户重定向到其他 Web 应用程序中的 URL。 | | | | | | 注意 | | | | | | 在跨应用程序执行重定向时,必须确保跨越已通过身份验证的应用程序复制 authentication 的 forms 元素(ASP.NET 设置架构) 中的几个特性。 | | | | | | 此特性可以为下列值之一。 | | | | | | 值说明 | | | | | | True指定能够将通过身份验证的用户重定向到其他 Web 应用程序中的 URL。 | | | | | | False指定不能将通过身份验证的用户重定向到其他 Web 应用程序中的 URL。 | | | | | | 此特性是 .NET Framework 2.0 版中的新特性。 | | | | | | 默认值为 False。 | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | loginUrl | 可选特性。 | | | | | | 指定如果找不到任何有效的身份验证 Cookie,将请求重定向到的用于登录的 URL。 | | | | | | 默认值为 login.aspx。 | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | name | 可选特性。 | | | | | | 指定要用于身份验证的 HTTP Cookie。 如果正在一台服务器上运行多个应用程序并且每个应用程序都需要唯一的 Cookie,则必须在每个应用程序的 Web.config 文件中配置 Cookie 名称。 | | | | | | 默认值为 ".ASPXAUTH"。 | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | path | 可选特性。 | | | | | | 为应用程序发出的 Cookie 指定路径。 | | | | | | 默认值是斜杠 (/),这是因为大多数浏览器是区分大小写的,如果路径大小写不匹配,浏览器不会送回 Cookie。 | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | protection | 可选特性。 | | | | | | 指定 Cookie 使用的加密类型(如果有)。 | | | | | | 此特性可以为下列值之一。 | | | | | | 值说明 | | | | | | All指定应用程序同时使用数据验证和加密方法来保护 Cookie。该选项使用已配置的数据验证算法,该算法基于 machineKey 元素。如果 Triple-DES (3DES) 可用并且密钥足够长(48 字节或更长),则可将 Triple-DES | | | 用于加密。 All 是默认(推荐)值。 | | | | | | Encryption指定使用 3DES 或 DES 对 Cookie 进行加密,但不对 Cookie 执行数据验证。采用这种方式的 Cookie 可能受到精选的纯文本的攻击。 | | | | | | None指定对于将 Cookie 仅用于个性化并且具有较低的安全要求的站点,同时禁用加密和验证。请不要以此方式使用 Cookie;但是,通过这种方法在 .NET Framework 中启用个性化占用的资源最少。 | | | | | | Validation指定验证方案验证已加密的 Cookie 的内容在转换中是否未被更改。Cookie 是使用 Cookie 验证创建的,方法是:将验证密钥与 Cookie 数据相连接,然后计算消息身份验证代码 (MAC),最后将 MAC | | | 追加到传出 Cookie。 | | | | | | 默认值为 All。 | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | requireSSL | 可选特性。 | | | | | | 指定是否需要 SSL 连接来传输身份验证 Cookie。 | | | | | | 此特性可以为下列值之一。 | | | | | | 值说明 | | | | | | True指定必须使用 SSL 连接来保护用户凭据。如果为 True,则 ASP.NET 为身份验证 Cookie 设置 Secure 属性,并且除非连接使用 SSL,否则兼容的浏览器不会返回 Cookie。 | | | | | | False指定不要求使用 SSL 连接来传输 Cookie。默认值为 False。 | | | | | | 默认值为 False。 | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | slidingExpiration | 可选特性。 | | | | | | 指定是否启用可调过期时间。 可调过期将 Cookie 的当前身份验证时间重置为在单个会话期间收到每个请求时过期。 | | | | | | 此特性可以为下列值之一。 | | | | | | 值说明 | | | | | | True指定启用可调过期时间。在单个会话期间,身份验证 Cookie 被刷新,并且每个后续请求的到期时间被重置。 | | | | | | False指定不启用可调过期,并指定 Cookie 在最初发出之后,经过一段设定的时间间隔后过期。 | | | | | | 默认值为 True。 | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | ticketCompatibilityMode | 可选特性。 | | | | | | 指定在 Forms 身份验证中对于票证到期日期使用协调世界时 (UTC) 还是本地时间。 | | | | | | 此特性可以具有下列值之一。 | | | | | | 值说明 | | | | | | Framework20指定用本地时间存储票证到期日期。 | | | | | | Framework40指定用 UTC 存储票证到期日期。 | | | | | | 默认值为 Framework20。 | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | timeout | 可选特性。 | | | | | | 指定 Cookie | | | 过期前逝去的时间(以整数分钟为单位)。 如果 SlidingExpiration 特性为 true,则 timeout 特性是滑动值,会在接收到上一个请求之后的指定时间(以分钟为单位)后过期。 为防止危及性能并避免向开启 | | | Cookie 警告的用户发出多个浏览器警告,当指定的时间逝去大半时将更新 Cookie。 这可能导致精确性受损。 默认值为 "30"(30 分钟)。 | | | | | | 注意 | | | | | | 在 ASP.NET V1.1 下,无论超时特性的设置如何,持久性 Cookie 都不会超时。但是,从 ASP.NET V2.0 起,根据超时特性的设置,持久性 Cookie 会超时。 | +-----------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

二:创建身份验证票

 1   FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,//版本号
 2         username,//用户唯一标识(帐号或者ID)
 3         DateTime.Now,//当前时间
 4         DateTime.Now.AddMinutes(30),//过期时间
 5         isPersistent,//是否跨浏览器会话保存,如果为否,则浏览器关闭后就会失效,类似于session
 6         userData,//自定义数据
 7         FormsAuthentication.FormsCookiePath);
 8 
 9       // 加密验证票
10       string encTicket = FormsAuthentication.Encrypt(ticket);
11 
12       // 创建Cookie
13       Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
14 
15       // 过行跳转
16       Response.Redirect(FormsAuthentication.GetRedirectUrl(username, isPersistent));


三:身份验证

要进行用户是否已登录验证,我们只需要增中location配置节就可以,完整配置如下:

1   <location path="test">   
2     <system.web>   
3       <authorization>   
4         <allow roles="test,admin"/> 
5         <allow users="*"/> 
6         <deny users="?"/>   
7       </authorization>   
8     </system.web>   
9   </location>

其中location节点中的属性path表示要验证的目录或者文件
authorization节点下,allow子节点,表过允许;deny节点表示拒绝.完整配置如下:


子标记 说明 allow 向授权规则映射添加一个规则,该规则允许对资源进行访问。 deny 向授权规则映射添加一条拒绝对资源的访问的授权规则。


allow/deny 节点属性如下:

+-----------------------------------+----------------------------------------------------------------+ | 属性 | 说明 | +-----------------------------------+----------------------------------------------------------------+ | users | 必选的 String 属性。 | | | | | | 一个逗号分隔的用户名列表,这些用户名被拒绝对资源进行访问。问号 | | | (?) 表示拒绝匿名用户;星号 (*) 表示拒绝所有用户访问。 | +-----------------------------------+----------------------------------------------------------------+ | roles | 必选的 String 属性。 | | | | | | 一个逗号分隔的角色列表,这些角色被拒绝对资源进行访问。 | +-----------------------------------+----------------------------------------------------------------+ | verbs | 可选的 String 属性。 | | | | | | 一个逗号分隔的 HTTP 传输方法列表,这些 HTTP | | | 传输方法被授予对资源的访问权限。 | +-----------------------------------+----------------------------------------------------------------+

我们也可以自己在代码中进行验证

1   Context.User.Identity.IsAuthenticated //表示是否验证了用户
2   Context.User.Identity.Name //获取用户标识

作者:翅膀的初衷 来源:www.jiniannet.com 参考资料:msdn.microsoft.com