Asp.net的身分識別驗證有有三種,分別是 "Windows | Forms |Passport ",其中又以Forms驗證用的最多,也最靈活。
Forms驗證方式對基於使用者的驗證授權提供了很好的支援,可以通過一個登入頁面驗證使用者的身份,將此使用者的身份發回到用戶端的Cookie,之後此使用者再訪問這個web應用就會連同這個身份Cookie一起發送到服務端。服務端上的授權設定就可以根據不同目錄對不同使用者的訪問授權進行控制了。
它的原理是這樣的:
首先對使用者授權,比如不允許匿名訪問等,然後對比web.config中配置的或者是資料庫中的使用者名稱和密碼判斷其合法性,合法後給其發驗證成功的憑證,將使用者資訊儲存到相應的cookie中,並添加到用戶端,當二次訪問的時候,用戶端將使用者資訊和憑證一起發到伺服器中,檢驗有了憑證就可以不用登陸了,否則就重新導向到預設的登入頁面。
它與傳統的session+cookie使用最大的好處就是不用每頁都判斷使用者是否存在,省了很多大量重複的代碼
下面就來重點介紹一些Forms驗證使用的幾個簡單步驟
首先需要在web.config設定檔中配置資訊,包括驗證模式,授權等
<authentication mode="Forms">
<formsname ="Adminck" protection="All"loginUrl="login.aspx" defaultUrl="Default.aspx"path="/" timeout="60">
<credentialspasswordFormat="Clear"> //憑證
<username="admin" password="admin"/>
<username="shuang" password="shuang"/>
</credentials>
</forms>
</authentication>
首先將mode的驗證方式從window改成Forms,forms中的name是用來儲存驗證資訊的cookie的名稱,預設為.aspxauth, protection是使用者資訊的處理方式,loginUrl當沒驗證通過或者沒憑證的時候轉到的頁面,一般都是登入頁面,defaultUrl是登入驗證成功後預設進入的頁面,path是cookie儲存的路徑,預設為”/” 這是因為大多數瀏覽器是區分大小寫,如果路徑大小寫不匹配,瀏覽器不會送回Cookie。Timeout代表cookie到期的時間,黑色的部分是在web.config中儲存了使用者名稱和密碼,如果你的使用者名稱和密碼是在資料庫中存的,那麼這段可以不用寫
下面就要對使用者進行授權了
<authorization>
<denyusers=" "/> 拒絕匿名訪問
<denyusers="shuang"/> 拒絕shuang訪問
<allowusers="admin"/> 允許admin訪問
</authorization>
如果你沒授權,最起碼是匿名訪問不允許,那麼Forms驗證將不起作用
配置(web.config)中配置好這些以後,需要到登入頁面對使用者進行驗證
protected voidButton1_Click(object sender, EventArgs e)
{
stringreturnUrl = Request["ReturnUrl"];
if(FormsAuthentication.Authenticate(txtName.Text, txtpwd.Text))
{
System.Web.Security.FormsAuthentication.SetAuthCookie(txtName.Text,true);
Session["userName"]= txtName.Text;
if (returnUrl == null)
{
FormsAuthentication.RedirectFromLoginPage(txtName.Text,false);
}
else
{
Response.Redirect(returnUrl);
}
}
else
{
this.ClientScript.RegisterStartupScript(this.GetType(),"", "<script>alert('使用者名稱或密碼輸入錯誤')</script>");
}
}
returnUrl:返回你訪問的那個頁面的url,如果存在,那麼登入成功後可以直接進入改頁面
if裡驗證的條件不一定是FormsAuthentication.Authenticate(txtName.Text,txtpwd.Text),這個是當使用者存放到設定檔中的驗證條件,如果是在資料量裡,直接調用那個驗證的方法就可以了,驗證成功之後,就可以發使用者憑證了:
System.Web.Security.FormsAuthentication.SetAuthCookie(txtName.Text,true);
可以結合session一起使用,用session儲存一下使用者的資訊(session登陸、訪問)
Session["userName"] = txtName.Text;
然後判斷returnUrl是否存在
if (returnUrl == null)
{
FormsAuthentication.RedirectFromLoginPage(txtName.Text,false);
}
else
{
Response.Redirect(returnUrl);}
RedirectFromLoginPage:重新導向到登入成功後預設的頁面
這樣基本就完成了Forms的驗證,還有一下幾點需要注意:
1、 web.config最好放到控制的目錄下,比如一般在後台用的比較多,我們就直接把它放到admin下面就可以了
在根目錄下面的web.config中我們可以放Forms驗證的參數如:
<authenticationmode="Forms">
<formspath="/" defaultUrl="~/admin/admin_index.aspx"loginUrl="~/admin/Login.aspx"
timeout="20"requireSSL="false" cookieless="UseDeviceProfile"name="hly8_com"
enableCrossAppRedirects="false"></forms>
</authentication>
admin下面的web.config用來授權就可以了
<!-- 這裡配置,配置網站都要登入 -->
<authorization>
<denyusers=" "/>
</authorization>
有的時候我們會發現有些檔案或者圖片訪問不到,:
這是因為圖片目錄你也禁止了訪問,在web.config中加上以下代碼即可:
<locationpath="images">
<!--允許所有人訪問這個頁面-->
<system.web>
<authorization>
<allow users=" "/>
</authorization>
</system.web>
</location>
2、 我們可以在其他的頁面通過User.identity.name獲得使用者名稱,可以通過User.identity. RedirectFromLoginPage判斷使用者是否登入
3、 登出退出的時候,因為即使你清空了cookie轉到了登入頁面,但是因為頁面是儲存在用戶端中,所以後退的時候還能退到最後的頁面,這樣是不行的,在這裡我們可以這樣寫:
首先將憑證毀掉:FormsAuthentication.SignOut();
Response.Redirect(Request.Path);
這樣就不會出現那種後退的問題了!也可以使用微軟提供的登出控制項
總之,這些東西要可以靈活使用!