[轉]Membership三步曲之入門篇 - Membership基礎樣本

來源:互聯網
上載者:User

標籤:

  Membership 三步曲之入門篇 - Membership基礎樣本

  1. Membership三步曲之入門篇 -  Membership基礎樣本
  2. Membership三步曲之進階篇 -  深入剖析Provider model
  3. Membership三步曲之進階篇 -  從Membership 到 .NET 4.5 之 AspNet.Identity

  Membership是ASP.NET為我們提供的一套驗證和儲存使用者憑證的架構。它可以協助我們快速的開發使用者登入、管理以及許可權驗證相關的模組,很多人可能會說Membership開發起來確實很快,但是總是和需求有那麼一點不匹配,那我們就要用到Membership的自訂擴充功能了,如果真正掌握了Membership的話,對於我們快速開發還是有很大協助的,更重要的是Membership是一套可靈活擴充的架構,包括裡面的Provider模型對於想學習架構的同學來說是一個不錯的案例,那麼接下來我們就來一步一步的看看Membership是如何做到的。 

  入門篇會從0開始將Membership整合到一個空的MVC網站中,並且與ASP.NET的許可權管理體系相結合。進階篇將剖析Membership的設計理念以及它的結構。進階篇我們將會擴充自己的MembershipProvider和RolesProvider,目地是直接利用我們老系統中已經存在的使用者表和角色表,也就是用我們已經存在的資料庫去整合Membership。

  注意:使用VS2012建立一個Internet的MVC項目,會直接協助我們產生一個已經整合好Membership的一個項目。但是我們會從頭開始自己把Membership加入到一個空的項目中,這樣更有利於我們理解它的工作原理 :)。

目錄
  1. Membership類成員介紹
  2. 整合Membership到ASP.NET MVC網站中
  3. 為Membership啟用角色管理
Membership類成員介紹

  一般來講我們的網站要實現的與使用者相關的最準系統包括:註冊,登入,修改使用者資料和密碼。Membership為我們提供了以下幾個類來協助我們完成這些功能。

  在System.Web.Security的命名空間包含了中的8個類,但是實際上我們只需要Membership一個類就可以協助我們完成大部份的功能。接下來我們就來一步一步的將Membership整合到我們的MVC網站中去。

整合Membership到ASP.NET MVC網站中

  這裡我們的需求很簡單,只是要實現一個包含註冊、登入、以及修改密碼功能的網站就可以了。我們接下來要做的就是建立一個基本的MVC網站,然後再配置Membership,加上我們的功能代碼。

2.1 建立一個基本的MVC網站

  

  

  我們的網站預設已經啟用Forms認證,如果不瞭解Foms的話,園子裡面有一篇比較好的文章,我已經加上連結了。但是Forms有安全方面的隱患,這個系列的後面我們會對比各種認證方式,有興趣的同學請繼續關注。

  同時,還為我們預設配置了一個MembershipProvider(我們下面會說這個東西,這裡暫時忽略也沒有關係)

2.2 添加功能代碼

  雖然說我們建立的這個項目已經配置好了Membership,但是並沒有地方去使用它。我們沒有Controller也沒有View。所以接下來我們就要開始加入調用Membership的代碼了。

  首先我們在Layout裡面加上三個連結:Register, Login, 如果已經登入的話我們就顯示使用者名稱和LogOff。 

  當然我們還得加上HomeController並且添加一個預設的Index Action。然後我們再加上AccountController並且添加4個Action(Login和Register的Get、Post版本),View的代碼我就不貼了,大家可以到未尾下載整個項目的源碼。

  登入代碼

?
12345678910111213141516171819202122 public ActionResult Login(){    return View();} [HttpPost][AllowAnonymous][ValidateAntiForgeryToken]public ActionResult Login(LoginModel model, string returnUrl){    // Membership.ValidateUser 判斷使用者名稱和密碼是否正確    if (ModelState.IsValid && Membership.ValidateUser(model.UserName, model.Password))    {        // 調用Forms 的登入 User.Identity.IsAuthenticated 將設定為True        // User.Identity.Name 會設定成我們下面的UserName        FormsAuthentication.SetAuthCookie(model.UserName, false);        return RedirectToLocal(returnUrl);    }     ModelState.AddModelError("", "The user name or password provided is incorrect.");    return View(model);}

   註冊相關代碼

?
123456789101112131415161718192021222324252627282930 public ActionResult Register(){    return View();} [HttpPost][AllowAnonymous][ValidateAntiForgeryToken]public ActionResult Register(RegisterModel model){    if (ModelState.IsValid)    {        try        {               // Membership.CreateUser去建立使用者            var user = Membership.CreateUser(model.UserName, model.Password);            if (user != null)            {                //註冊完成之後直接登入使用者                FormsAuthentication.SetAuthCookie(user.UserName, false);            }            return RedirectToAction("Index", "Home");        }        catch (MembershipCreateUserException e)        {            ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));        }    }    return View(model);}

   登出相關代碼

?
1234567 [HttpPost][ValidateAntiForgeryToken]public ActionResult LogOff(){    FormsAuthentication.SignOut();    return RedirectToAction("Index", "Home");}

  修改密碼相關代碼

?
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 [HttpPost][ValidateAntiForgeryToken]public ActionResult LogOff(){    FormsAuthentication.SignOut();    return RedirectToAction("Index", "Home");} [Authorize]public ActionResult Manage(){    return View();} /**************************************************//*注意我們為Manage這兩個Action加上了Authorize標籤,只有登入過的使用者才能訪問  如果使用者沒有登入直接存取/Account/Manage會被跳到/Account/Login要求登入*/ [Authorize][HttpPost][ValidateAntiForgeryToken]public ActionResult Manage(LocalPasswordModel model){    if (ModelState.IsValid)    {        bool changePasswordSucceeded;        try        {            var user = Membership.GetUser(User.Identity.Name);            changePasswordSucceeded = user.ChangePassword(model.OldPassword,                model.NewPassword);        }        catch (Exception)        {            changePasswordSucceeded = false;        }         if (changePasswordSucceeded)        {            return RedirectToAction("Manage", new { Message = "修改密碼成功!"});        }        else        {            ModelState.AddModelError("", "老密碼不正確或新密碼不符合要求");        }    }    return View(model);}

  就是這麼簡單,我們的註冊,登入,以及修改密碼功能就完成了。

  來看一下我們用到了哪些Membership的功能:

  • Membership.ValidateUser 驗證使用者名稱和密碼實現登入 
  • Membership.CreateUser 建立新使用者
  • Membership.GetUser 擷取使用者
  • MembershipUser.ChangePassword 修改密碼

  還有更多的方法我們可以使用,在最上面的表中我們已經列出來了,大家可以自行嘗試。這些功能都出來以後,我們還有一個疑問沒有解答,那就是我們的使用者儲存到哪裡去了? 

  Membership的配置節點中有一個connctionStringName的屬性,可以指定我們的資料庫連接字串。那我們就來看一下它都幫我們搞了一個什麼樣的資料庫。註:這個資料庫是Membership幫我們產生的,我之前並沒有建立它,也就是我們只需要寫好連接字串就可以了。

  而我們的使用者資訊就儲存在Users表和Memberships表中。

為Membership啟用角色管理

  我們已經完成了登入、註冊和修改密碼的功能。登入屬性認證的範疇,而與認證如影隨形的還是授權。通俗的講,認證是看這個使用者是不是合法的,像一扇門,你放不放穿上使用者進來。而授權是在他進來之後能夠幹什麼,他可以坐在椅子上,但絕對不能坐在你頭上,又或者你只允許你爸或者你老婆坐在你頭上,這就是授權了。

  相信很多人都自己寫過許可權相關的代碼,也有人會寫出一套許可權管理的架構來。其實ASP.NET已經有一套比較成熟的許可權體系,加上它的自訂功能基本可以滿足我們大多數的需求了。

  在我們建立這個MVC網站的時候,VS也為我們配置了許可權模組。就在挨著membership結點的下方:

  因為我們這裡面的連接字串與我們的membersihp中用到的是同一個,所以和許可權相關的表Roles、UserInRoles也建立到了同一個資料庫中。不一樣的是我們不需要寫一行代碼就可以完成角色管理的功能,包括建立/修改/刪除角色,以及給使用者賦予角色。

  通過項目->ASP.NET 配置就可以開啟這個小網站去管理我們的角色(抱歉,我用的英文版 - -! )。

  我們可以點擊Security(安全)到系統管理使用者和角色的地頁面。

我們先添加3個角色:Admin, Manager, User

然後我們就可以給我們的使用者賦予角色了。

  接下來我們就可以在代碼中使用User.IsInRole方法是看使用者是否具有某一個角色的許可權了。在MVC的Action上我們可以直接在Authorize標籤中指定某個角色,那麼這個Action就只有這個角色下的使用者才能夠訪問了。

?
12345 [Authorize(Roles="Admin")]public ActionResult Manage(){    return View();}

  我們還可以通過調用Roles.GetRolesForUser將這個使用者相關的角色的都取出來。

  現在我們就已經為我們的網站添加認證和授權模組了,分分搞定啊!功能是完成了,但是還留下了不少的問題需要解決,因為大多數情況下我們的User表都不會這麼簡單,要多加一些欄位怎麼辦? 我們使用了EF需要使用User entity怎麼辦?又或者角色是有父子關係的又該如何做呢?我們後面的進階篇將會告訴你答案。

  Demo下載:http://pan.baidu.com/s/1gduY5CR (你點或不點,推薦按鈕就在右下角 !)

[轉]Membership三步曲之入門篇 - Membership基礎樣本

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.