1. Asp.Net身份认证的方式
1. Asp.net的身份验证有"Windows | Forms | Passport"3种方式,其中又以Forms验证用的最多,也最灵活.
2. 在ASP.NET中,整个身份认证的过程其实可分为二个阶段:认证与授权。
a) 认证阶段:识别当前请求的用户是不是一个可识别(的已登录)用户
b) 授权阶段:是否允许当前请求访问指定的资源
这二个阶段在ASP.NET管线中用AuthenticateRequest和AuthorizeRequest事件来表示, 通过查看反编译的源码,如下图:
查看FormsAuthenticationModule的init方法的源代码,可以看到执行AuthenticateRequest事件时会执行认证方法this.OnEnter,如下图:
2. Form表单身份认证
1. Forms认证是由FormsAuthenticationModule实现的,URL的授权检查是由UrlAuthorizationModule实现的.
2. Form表单身份认证的配置
认证配置说明:
<system.web> <authentication mode="Forms"> <forms loginUrl="Login.aspx" protection="All" timeout="30" name=".ASPXAUTH" path="/" requireSSL="false" slidingExpiration="true" defaultUrl="default.aspx" cookieless="UseDeviceProfile" enableCrossAppRedirects="false" /> </authentication> </system.web>
下面是对默认属性值的描述:
-
loginUrl 指向应用程序的自定义登录页。应该将登录页放在需要安全套接字层 (SSL) 的文件夹中。这有助于确保凭据从浏览器传到 Web 服务器时的完整性。
-
protection 设置为 All,以指定窗体身份验证票的保密性和完整性。这导致使用 machineKey 元素上指定的算法对身份验证票证进行加密,并且使用同样是 machineKey 元素上指定的哈希算法进行签名。
-
timeout 用于指定窗体身份验证会话的有限生存期。默认值为 30 分钟。如果颁发持久的窗体身份验证 Cookie,timeout 属性还用于设置持久 Cookie 的生存期。
-
name 和 path 设置为应用程序的配置文件中定义的值。
-
requireSSL 设置为 false。该配置意味着身份验证 Cookie 可通过未经 SSL 加密的信道进行传输。如果担心会话窃取,应考虑将 requireSSL 设置为true。
-
slidingExpiration 设置为 true 以执行变化的会话生存期。这意味着只要用户在站点上处于活动状态,会话超时就会定期重置。
-
defaultUrl 设置为应用程序的 Default.aspx 页。
-
cookieless 设置为 UseDeviceProfile,以指定应用程序对所有支持 Cookie 的浏览器都使用 Cookie。如果不支持 Cookie 的浏览器访问该站点,窗体身份验证在 URL 上打包身份验证票。
-
enableCrossAppRedirects 设置为 false,以指明窗体身份验证不支持自动处理在应用程序之间传递的查询字符串上的票证以及作为某个窗体 POST 的一部分传递的票证。
3. Form表单身份认证的原理
新建一个AuthenticationLogin_Test.aspx页面,前端代码如下
<form action="<%= Request.RawUrl %>" method="post">
<fieldset>
<legend>用户状态</legend>
<% if( Request.IsAuthenticated ) { %>
当前用户已登录,登录名:<%= Context.User.Identity.Name %> <br />
<input type="submit" name="btnLogout" value="退出" />
<% } else { %>
<b>当前用户还未登录。</b>
<% } %>
</fieldset>
<fieldset>
<legend>普通登录</legend>
登录名:<input type="text" name="loginName" style=" 200px" value="hoby" />
<input type="submit" name="btnNormalLogin" value="登录" />
</fieldset>
</form>
后台代码如下:
protected void Page_Load(object sender, EventArgs e)
{
if (Request.Form["btnLogout"] != null)//点击了注销按钮
{
Logout();
}
else if (Request.Form["btnNormalLogin"] != null) //点击了登陆按钮
{
NormalLogin();
}
}
public void Logout()
{
FormsAuthentication.SignOut();
Response.Redirect("AuthenticationLogin_Test.aspx");
}
public void NormalLogin()
{
string loginName = Request.Form["loginName"];
if (string.IsNullOrEmpty(loginName)) return;
//写入认证的Cookie
FormsAuthentication.SetAuthCookie(loginName, true);
Response.Redirect("AuthenticationLogin_Test.aspx");
}
Web.config配置如下:
<system.web>
<!--设置认证方式-->
<authentication mode="Forms">
<!-- name 默认为: ".ASPXAUTH" ; cookieless:标识票据存储的方式,默认为cookie存储 -->
<forms name=".ASPXAUTH" loginUrl="~/AuthenticationLogin_Test.aspx" timeout="60" cookieless="UseCookies" />
</authentication>
<!-- 设置授权信息(与Form表单认证一起使用)-->
<authorization>
<deny users="?"/>
</authorization>
</system.web>
通过Firebug查看,Form表单认证通过写入一个Cookie来标识用户是否登陆,Cookie的值是经过加密的, Cookie的默认名称为’.ASPXAUTH’, 用户可以自定义这个名称.
请求其他页面,通过Firebug查看到携带的Cookie信息如下:
用户登录的过程大致是这样的:
(1) 检查用户提交的登录名和密码是否正确。
(2) 根据登录名创建一个FormsAuthenticationTicket对象。
(3)调用FormsAuthentication.Encrypt()加密。
(4)根据加密结果创建登录Cookie,并写入Response。
在登录验证结束后,后面的每次请求都将带上前面产生的加密Cookie,供服务器来验证登录状态。
每次请求时的(认证)处理过程如下:
(1)FormsAuthenticationModule尝试读取登录Cookie。
(2)从Cookie中解析出FormsAuthenticationTicket对象。过期的对象将被忽略。
(3)根据FormsAuthenticationTicket对象构造FormsIdentity对象并设置HttpContext.User
(4)UrlAuthorizationModule执行授权检查。
-----------------------------------------------
参考网址
http://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.html
http://msdn.microsoft.com/zh-cn/library/ff647070.aspx