西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
軟件
軟件
文章
搜索

首頁(yè)編程開發(fā)ASP.NET → ASP.NET 打造窗體身份驗(yàn)證及角色權(quán)限管理代碼示例

ASP.NET 打造窗體身份驗(yàn)證及角色權(quán)限管理代碼示例

相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來源:本站整理時(shí)間:2010/10/27 23:05:31字體大。A-A+

作者:佚名點(diǎn)擊:394次評(píng)論:0次標(biāo)簽: 窗體身份驗(yàn)證 角色權(quán)限管理

  • 類型:系統(tǒng)其它大。2.2M語(yǔ)言:中文 評(píng)分:10.0
  • 標(biāo)簽:
立即下載

ASP.NET MVC 建立 ASP.NET 基礎(chǔ)之上,很多 ASP.NET 的特性(如窗體身份驗(yàn)證、成員資格)在 MVC 中可以直接使用。本文旨在提供可參考的代碼,不會(huì)涉及這方面太多理論的知識(shí)。

本文僅使用 ASP.NET 的窗體身份驗(yàn)證,不會(huì)使用它的 成員資格(Membership) 和 角色管理 (RoleManager),原因有二:一是不靈活,二是和 MVC 關(guān)系不太。

一、示例項(xiàng)目

User.cs 是模型文件,其中包含了 User 類:

public class User
{
public int ID {
get; set;
}
public string Name {
get; set;
}
public string Password {
get; set;
}
public string[]
Roles { get; set; }

}

UserRepository 為數(shù)據(jù)存取類,為了演示方便,并沒有連接數(shù)據(jù)庫(kù),而是使用一個(gè)數(shù)組來作為數(shù)據(jù)源:

public class UserRepository { private static User[] usersForTest = new[]{ new User{ ID = 1, Name = "bob", Password = "bob", Roles = new []{"employee"}}, new User{ ID = 2, Name = "tom", Password = "tom", Roles = new []{"manager"}}, new User{ ID = 3, Name = "admin", Password = "admin", Roles = new[]{"admin"}}, }; public bool ValidateUser(string userName, string password) { return usersForTest .Any(u => u.Name == userName && u.Password == password); } public string[] GetRoles(string userName) { return usersForTest .Where(u => u.Name == userName) .Select(u => u.Roles) .FirstOrDefault(); } public User GetByNameAndPassword(string name, string password) { return usersForTest .FirstOrDefault(u => u.Name == name && u.Password == password); } }

二、用戶登錄及身份驗(yàn)證

方式一

修改 AccountController:原有 AccountController 為了實(shí)現(xiàn)控制反轉(zhuǎn),對(duì)窗體身份驗(yàn)證進(jìn)行了抽象。為了演示方便,我去除了這部分(以及注冊(cè)及修改密碼部分):

public class AccountController : Controller { private UserRepository repository = new UserRepository(); public ActionResult LogOn() { return View(); } [HttpPost] public ActionResult LogOn(LogOnModel model, string returnUrl) { if (ModelState.IsValid) { if (repository.ValidateUser(model.UserName, model.Password)) { FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); if (!String.IsNullOrEmpty(returnUrl)) return Redirect(returnUrl); else return RedirectToAction("Index", "Home"); } else ModelState.AddModelError("", "用戶名或密碼不正確!"); } return View(model); } public ActionResult LogOff() { FormsAuthentication.SignOut(); return RedirectToAction("Index", "Home"); } }

修改 Global.asax:

public class MvcApplication : System.Web.HttpApplication { public MvcApplication() { AuthorizeRequest += new EventHandler(MvcApplication_AuthorizeRequest); } void MvcApplication_AuthorizeRequest(object sender, EventArgs e) { IIdentity id = Context.User.Identity; if (id.IsAuthenticated) { var roles = new UserRepository().GetRoles(id.Name); Context.User = new GenericPrincipal(id, roles); } } //... }

給 MvcApplication 增加構(gòu)造函數(shù),在其中增加 AuthorizeRequest 事件的處理函數(shù)。

代碼下載:Mvc-FormsAuthentication-RolesAuthorization-1.rar (243KB)

方式二

此方式將用戶的角色保存至用戶 Cookie,使用到了 FormsAuthenticationTicket。

修改 AccountController:

public class AccountController : Controller { private UserRepository repository = new UserRepository(); public ActionResult LogOn() { return View(); } [HttpPost] public ActionResult LogOn(LogOnModel model, string returnUrl) { if (ModelState.IsValid) { User user = repository.GetByNameAndPassword(model.UserName, model.Password); if (user != null) { FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( 1, user.Name, DateTime.Now, DateTime.Now.Add(FormsAuthentication.Timeout), model.RememberMe, user.Roles.Aggregate((i,j)=>i+","+j) ); HttpCookie cookie = new HttpCookie( FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket)); Response.Cookies.Add(cookie); if (!String.IsNullOrEmpty(returnUrl)) return Redirect(returnUrl); else return RedirectToAction("Index", "Home"); } else ModelState.AddModelError("", "用戶名或密碼不正確!"); } return View(model); } public ActionResult LogOff() { FormsAuthentication.SignOut(); return RedirectToAction("Index", "Home"); } }

修改 Global.asax:

public class MvcApplication : System.Web.HttpApplication { public MvcApplication() { AuthorizeRequest += new EventHandler(MvcApplication_AuthorizeRequest); } void MvcApplication_AuthorizeRequest(object sender, EventArgs e) { var id = Context.User.Identity as FormsIdentity; if (id != null && id.IsAuthenticated) { var roles = id.Ticket.UserData.Split(','); Context.User = new GenericPrincipal(id, roles); } } //... }

代碼下載:Mvc-FormsAuthentication-RolesAuthorization-2.rar (244KB)

三、角色權(quán)限

使用任一種方式后,我們就可以在 Controller 中使用 AuthorizeAttribute 實(shí)現(xiàn)基于角色的權(quán)限管理了:

[Authorize(Roles = "employee,manager")] public ActionResult Index1() { return View(); } [Authorize(Roles = "manager")] public ActionResult Index2() { return View(); } [Authorize(Users="admin", Roles = "admin")] public ActionResult Index3() { return View(); }

四、簡(jiǎn)要說明

MVC 使用 HttpContext.User 屬性進(jìn)行來進(jìn)行實(shí)現(xiàn)身份驗(yàn)證及角色管理,同樣 AuthorizeAttribute 也根據(jù) HttpContext.User 進(jìn)行角色權(quán)限驗(yàn)證。

因些不要在用戶登錄后,將相關(guān)用戶信息保存在 Session 中(網(wǎng)上經(jīng)?吹竭@種做法),將用戶保存在 Session 中是一種非常不好的做法。

也不要在 Action 中進(jìn)行角色權(quán)限判斷,應(yīng)該使用 AuthorizeAttribute 或它的子類,以下的方式都是錯(cuò)誤的:

public ActionResult Action1() { if (Session["User"] == null) { /**/} /**/ } public ActionResult Action2() { if (User.Identity == null) { /**/} if (User.Identity.IsAuthenticated == false) { /**/} if (User.IsInRole("admin") == false) { /**/} /**/ }

若本文中有錯(cuò)誤或不妥之處,敬請(qǐng)指正,謝謝!

    相關(guān)評(píng)論

    閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評(píng)論

    最新評(píng)論

    第 1 樓 廣東教育網(wǎng) 網(wǎng)友 客人 發(fā)表于: 2010/12/27 17:15:22
    鄙視 。。。

    支持( 0 ) 蓋樓(回復(fù))

    發(fā)表評(píng)論 查看所有評(píng)論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過審核才能顯示)