MVC 3.0 使用 s身份验证 (10).doc_第1页
MVC 3.0 使用 s身份验证 (10).doc_第2页
MVC 3.0 使用 s身份验证 (10).doc_第3页
MVC 3.0 使用 s身份验证 (10).doc_第4页
MVC 3.0 使用 s身份验证 (10).doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

我要学ASP.NET MVC 3.0(十): MVC 3.0 使用 Forms身份验证概述许多 Web 应用程序都要求能够限制对某些资源(例如特定页面)的访问,以确保只有经过身份验证的用户才能访问这些资源。 ASP.NET MVC 的默认 Web 应用程序项目模板提供了一个控制器以及一些数据模型和视图,您可使用这些组件为应用程序添加 ASP.NET 窗体身份验证功能。 借助该内置功能,用户可以注册、登录和注销,以及更改自己的密码。 对于许多应用程序,此功能可提供足够的用户身份验证级别。页面控件引用在MVC 3.0的项目模板里面的Shared文件夹中,我们可以看到名为_LogOnPartial.cshtml的页面,打开页面代码if(Request.IsAuthenticated) 欢迎使用 Context.User.Identity.Name! Html.ActionLink(注销, LogOff, User) else : Html.ActionLink(登录, LogOn, User) 我们可以看到该页面只是根据获取系统中的用户登录名,Context.User.Identity.Name判断是登录还是注销的。然后我们看看在什么地方用到了该页面?MVC 3.0的项目模板的Shared文件夹中,我们在_Layout.cshtml页面中找到了,这个页面就是项目的整个母版页,相当于.Master页面。代码 Html.Partial(_LogOnPartial) 这样简单的引用就可以将其他页面作为一个控件引用到该页面来。实现登录在前面的判断用户登录名时,我们可以看到有如下代码: Html.ActionLink(登录, LogOn, User) 该代码指定登录在UserController的LogOn方法。创建用户Model类 public class User public int ID get; set; DisplayName(姓名) Required(ErrorMessage = 姓名不能为空) public string Name get; set; DisplayName(密码) Required DataType(DataType.Password) public string Password get; set; Display(Name = 记住我?) public bool RememberMe get; set; public Roles Roles get; set; 创建角色Model类,便于后面页面角色的管理代码: public class Roles public int ID get; set; public string Name get; set; 当前一个用户对应一个角色,不是一对多。后面有空会做个例子出来。所以我们创建UserController在UserController添加LogOn方法代码 / * / URL: /User/LogOn / * public ActionResult LogOn() return View(); 创建视图代码model MvcApplication.Models.User ViewBag.Title = 用户登录; Layout = /Views/Shared/_Layout.cshtml; 用户登录using (Html.BeginForm() Html.ValidationSummary(true) 登录信息 Html.LabelFor(model = model.Name) Html.EditorFor(model = model.Name) Html.ValidationMessageFor(model = model.Name) Html.LabelFor(model = model.Password) Html.EditorFor(model = model.Password) Html.ValidationMessageFor(model = model.Password) Html.LabelFor(model = model.RememberMe) Html.EditorFor(model = model.RememberMe) Html.ValidationMessageFor(model = model.RememberMe) Html.ActionLink(返回主页, Index)有了界面,但是我们还没有对数据的操作业务逻辑接口创建一个名为IUserBusiness接口 public interface IUserBusiness / / 获取用户角色 / / / Roles GetRoles(string userName); / / 根据用户名和密码获取用户信息 / / / / User GetByNameAndPassword(string name, string password); / / 登录 / / / void SignIn(string userName, bool createPersistentCookie); / / 注销 / void SignOut(); 实现接口 public class UserBusiness : IUserBusiness / / 作为模拟的数据集 / private static User UserList = new new User ID = 1, Name = 张三, Password = 111111, Roles = new RolesID=101,Name = employee, new User ID = 2, Name = 李四, Password = 111111, Roles = new RolesID =102,Name = manager, new User ID = 3, Name = admin, Password = admin, Roles = new RolesID = 103,Name = admin ; / / 根据用户名获取角色 / / / public Roles GetRoles(string userName) return UserList .Where(o= o.Name = userName) .Select(o = o.Roles) .FirstOrDefault(); / / 根据用户名和密码获取用户 / / / / public User GetByNameAndPassword(string name, string password) return UserList .FirstOrDefault(u = u.Name = name & u.Password = password); / / 登录 / / / public void SignIn(string userName, bool createPersistentCookie) if (String.IsNullOrEmpty(userName) throw new ArgumentException(值不能为 null 或为空。, userName); FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); / / 注销 / public void SignOut() FormsAuthentication.SignOut(); 上面的角色获取和用户名密码获取都可以变化为数据库里面的数据。而登录只是把获取的数据添加到了cookies里面。注销亦然是使用了该机制。所以上面登录中的FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);完全可以换成 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( 1, user.Name, DateTime.Now, DateTime.Now.Add(FormsAuthentication.Timeout), user.RememberMe, user.Name ); HttpCookie cookie = new HttpCookie( FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket); Response.Cookies.Add(cookie);同样实现了登录的操作。方法调用我们在实现操作的时候要调用IUserBusiness接口中的相应方法来实现。所以参考微软的做法,重写了Initialize方法,把IUserBusiness接口作为一个属性在程序中使用。代码: public IUserBusiness UserBusiness get; set; protected override void Initialize(RequestContext requestContext) if (UserBusiness = null) UserBusiness = new UserBusiness(); base.Initialize(requestContext); 这样,每次加载的时候都会根据相应的方法去实例IUserBusiness。在UserController中新建Post的LogOn方法代码 HttpPost public ActionResult LogOn(User user, string returnUrl) if (ModelState.IsValid) if (UserBusiness.GetByNameAndPassword(user.Name, user.Password)!=null) UserBusiness.SignIn(user.Name, user.RememberMe); if (Url.IsLocalUrl(returnUrl) return Redirect(returnUrl); else return RedirectToAction(Index, Home); else ModelState.AddModelError(, 提供的用户名或密码不正确。); / 如果我们进行到这一步时某个地方出错,则重新显示表单 return View(user); 效果点击登录登陆后注销用户在UserController中添加LogOff的注销方法 / * / URL: /User/LogOff / * public ActionResult LogOff() UserBusiness.SignOut(); return RedirectToAction(Index, Home); 同样调用了 业务逻辑里面的注销方法。权限判断在之前我们加入了Roles也在业务逻辑里面添加了获取Role的方法,那么我们在什么时候来取得该用户的Role呢?我觉得是在页面验证之后要授权时,该方法在全局的Global.asax中,我们需要委托该事件。委托时我们再去根据当前用户获取角色,或者此时早已经将角色获取好了,只是加入到系统的Context之用。代码 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 UserBusiness().GetRoles(id.Name); string rolelist = new string roles.Name ; Context.User = new GenericPrincipal(id, rolelist); 然后我们在UserController只用需要权限的方法上加上对应的Authorize标志即可如代码 /新建 / GET: /User/Create Authorize public ActionResult Create() return View(); 如果你觉得,这样只是对于登录后所有的人有效,而你需要对指定的角色有效,你可以尝试用下面的方法。代码如下 /新建 / GET: /User/C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论