一步一步實現FormsAuthentic驗證登入

2022-02-13 03:23:01 字數 4486 閱讀 5163

本文不講原理,只講用法,原理性的東西網上特別多,不過還是會對一些要用到的東西進行解釋,不深入講原理。本文中用的是vs2012   .net mvc 4.0。原理看這篇文章

,看完這個文章絕對受益匪淺。

說下登入的整個流程:使用者輸入賬號密碼->點選提交->資料提交到後台控制器->去資料庫取得使用者資料->如果登入成功->將資料寫入cookie(也就是寫入forms身份驗證)->返回給控制器登入狀態->對相應的登入狀態進行處理。

第一步:新建乙個.net mvc 4.0的解決方案,然後配置 webconfig檔案

在 節點下新增以下**:

"

forms

" name="cookiename">

"~/login/login

" timeout="

2880

" />

簡要說明 一下上面的**:

loginurl登入頁的url。通過formsauthentication.loginurl屬性可以得到該配置值。當呼叫formsauthentication.redirecttologinpage()方法時,客戶端請求將被重定向到該屬性所指定的頁面。如果沒有設定這個屬性,.net也會嘗試在目錄下尋找名為login.aspx的檔案;

mode屬性,就是選擇的是forms模式的登入,還有其他模式(windows,passport等等);

name屬性,是cookie的名稱,在獲取登入的cookie時需要通過這個name來取得登陸用的cookie;

timeout屬性,就是cookie的過期時間,可以同slidingexpiration屬性 配合使用;

slidingexpiration屬性,是否啟用「彈性過期時間」,如果該屬性設定為false,從首次驗證之後過timeout時間後cookie即過期;如果該屬性為true,則從上次請求該開始過timeout時間才過期,也就是說,如果在timeout時間內,再次向伺服器端傳送請求,則cookie將永遠不會過期。

以上是主要用到的一些屬性。

關於配置檔案,若有資料庫,當然還要配置資料庫連線,這裡就不多說了。

第二步:建立使用者型別:usermodel

這個類主要是用來儲存登入的使用者的物件。

///

使用者 public

class

usermodels

///使用者姓名

[display(name = "

使用者姓名")]

public

string users_name

///賬號

[display(name = "賬號"

)]

public

string login_id

///密碼

[display(name = "密碼"

)]

public

string login_pwd

///身分

[display(name = "身份"

)]

public

int users_position

}

在這裡不對角色做太多的處理,users_position簡要的表明使用者所屬的角色。

第三步:新增乙個生產身份驗證的類setcookies

public

class

setcookies

string role = string

.empty;

switch (role)//

這裡簡要這幾個角色,實際應用中可以從資料庫中讀取角色

//生產身份驗證

formsauthenticationticket ticket = new formsauthenticationticket(1,id,datetime.now,enddate,true

,role,formsauthentication.formscookiepath);

//對身份驗證的標識進行加密

string encticket =formsauthentication.encrypt(ticket);

//建立將要寫入到客戶端的cookie

//如果勾選了是否自動登入,則將過期時間推遲14天

if(chkautologin)

//寫入到客戶端

formsauthentication.formscookiename 就是剛才在配置檔案中的name屬性的值

這裡小寫的role 類似於資料庫使用者表的外來鍵(一般都有乙個許可權表,這裡假設只有使用者表和角色表),大寫的role類似於資料庫角色表的角色名稱,這裡簡要處理角色,所以在真正專案中,可以在這裡從資料庫讀取使用者的角色,然後將其角色用逗號(或者其他符號隔開),生產乙個角色字串(類似於role="角色a,角色b,角色c")。最後將這個role傳到formsauthenticationticket 類的userdata引數中,在後面判斷角色的時候用到,userdata這個引數也不一定要放角色,也可以放其他要用到的資料,因專案而異。對formsauthenticationticket 這個類不清楚的,可以自己看看定義(最好還是去看看,對理解這個forms驗證登入有幫助)。以上這個類也算是forms登入中最重要的一步了。

第三步:驗證登入,從資料庫拿資料,然後返回登入狀態

先給出登入狀態的類,這是乙個列舉型別

public

class

enumlist

}

這個是列舉型別,不做解釋。

public

class

setloginrepository

else

}else

return

status;

}//從資料庫取得使用者資料,這裡使用的是ado.net

public

static usermodels getuserdata(string

id)

}return

model;}}

關於tuple的用法請看另一篇文章.net 4.0特性 tuple元組

。這裡先簡要解釋一下它的作用,tuple就是可以自定義任何型別,在返回值的時候,可以返回任意多個型別的資料,我認為它的作用就是能返回多種型別的資料。然後可以通過該型別的例項獲得相應的值,獲取值的方法是比如這個類的例項叫tuple,則取得值的方法是tuple.item1,tuple.item2....tuple.item8,通過這個可以取得對應位置的值。這就很方便的給我們提供了可以在乙個方法裡面返回多種資料型別。

第四步:也是非常重要的一步,global檔案新增乙個方法:

//

取得自定義的角色

public

sender, eventargs e) );

//指派角色到目前這個 httpcontext 的 user 物件去

context.user = new

genericprincipal(context.user.identity, roles);}}

這個方法是在global檔案中定義的,在客戶端每次發乙個請求都會先經過這個方法,即使是ajax請求也同樣要先經過這個方法。注釋寫得很清楚,不多說。

第五步 :寫控制器logincontroller

public actionresult setlogin(string name, string

password)

break

;

case

enumlist.loginsts.noexists:

//對使用者不存在的情況進行處理

break

;

case

enumlist.loginsts.passworderror:

//對密碼錯誤的情況進行處理

break

; }

}return

view();

}

順便附上退出的**:

public

static

void

clearsessionandcookie()

**很簡單,就是清除cookie,清除cookie的方法就是將它的過期時間設定為前一天。然後formsauthentication.signout()就退出了。

整個流程完成,前台頁面的**就不寫了,就兩個文字框加上乙個登入按鈕。還有乙個是否自動登入的按鈕,這裡就不演示了。

一步一步 Sql Azure

一步一步 sql azure 1.使用 windowsazure 平台賬號登陸 2.新建sqlazure server 3.新建資料庫 4.為sql azure server 新增防火牆規則,只有將本機新增到規則裡才能從本機連線到該sqlazure server 5.連線到sql azure ser...

一步一步帶你實現virtual dom(一)

一步一步帶你實現virtual dom 一 一步一步帶你實現virtual dom 二 props和事件 要寫你自己的虛擬dom,有兩件事你必須知道。你甚至都不用翻看react的源 或者其他的基於虛擬dom的 他們 量都太大,太複雜。然而要實現乙個虛擬dom的主要部分只需要大約50行的 50行 下面...

一步一步學cscope

告之 1,我不喜歡寫部落格 因為感覺太浪費時間 2,部落格能記住自己某階段學過的東西,而這些東西可能會很快的忘卻 所以我以後要學著在部落格上浪費時間 前言 本文件記錄了我今天 2007 11 9 下午學習cscope的一點收穫,特收錄部落格以作分享。在學習cscope過程中查閱了大量的文件,但發現適...