首页 > 代码库 > asp.net mvc 登陆实现
asp.net mvc 登陆实现
---恢复内容开始---
asp.net mvc5 登陆及用户身份管理(基础)
近期再写asp.net的网站其中有部分网页需要拥有特权的人才能访问(admin),所以研究如何可以实现用户身份管理。
因为我一开始创建的项目是一个空项目,添加文件夹及核心引用勾选的是mvc所以出现了不能使用Authorize特性登陆;
于是新建了一个项目并且选择了身份验证为个人用户账户。对比发现可能是因为少了startup.auth.cs文件所致。
下面这段代码是我写的登陆代码
1 [HttpGet] 2 public ActionResult login() 3 { 4 return View(); 5 } 6 [HttpPost] 7 [ValidateAntiForgeryToken] 8 public ActionResult login(Login login) 9 { 10 var users = db.Users.Where(a => a.Name == login.UserName); 11 if (!users.Any()) 12 return View(); 13 User user = users.First(); 14 var cards = db.Cards.Where(a => a.User_id == user.Id); 15 Card card = cards.First(); 16 if(login.Password=="123"&&card.Privilege==2) 17 { 18 FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket( 19 1, 20 login.UserName, 21 DateTime.Now, 22 DateTime.Now.AddMinutes(20), 23 false, 24 "admin" 25 ); 26 var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(Ticket)); 27 cookie.HttpOnly = true; 28 HttpContext.Response.Cookies.Add(cookie); 29 return RedirectToAction("../DataBase/SelectUser"); 30 } 31 return RedirectToAction("login"); 32 33 }
其中FormsAuthenticationTicket为加密票据,用于存放用户的信息,其中“admin”为用户的权限,用于之后控制器中Authorize(Roles="admin")特征。
接下来是要限制权限的控制器
1 public class DataBaseController : Controller 2 { 3 4 private AccessControlContext db = new AccessControlContext(); 5 //Users 6 public ActionResult SelectUser() 7 { 8 var user = db.Users; 9 return View(user.ToList()); 10 } 11 [HttpGet] 12 [Authorize(Roles = "admin")] 13 public ActionResult InsertUser() 14 { 15 return View(); 16 } 17 }
其中标有[Authorize(Roles="admin"]标志的就是只有拥有admin权限的用户才能使用。当然也可以将AuthorizeAttribute注册为全局过滤器,需要把它添加到RegisterGlobalFilters(包含在\App_Start\FilterConfig.cs文件中)
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new HandleErrorAttribute()); filters.Add(new System.Web.Mvc.AuthorizeAttribute()); }
然后在需要外部访问的方法前面用[AllowAnonymous]特性装饰即可。
如果用户身份验证失败,一般我们会选择将用户重定向到登陆界面。以便对有权查看原来页面的用户进行身份验证。
在asp.net以前的版本,这个重定向被FormsAuthenticationModule的OnLeave方法截获,并转而重定向到在应用程序web.config文件中定义的登陆页面,代码如下
1 <authentication mode="Forms"> 2 <forms loginUrl="~/Account/Login" timeout="2880" /> 3 </authentication>
但是在mvc5中我们可以直接更改Stratup.auth.cs中的代码
app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Account/Login"), Provider = new CookieAuthenticationProvider { // 当用户登录时使应用程序可以验证安全戳。 // 这是一项安全功能,当你更改密码或者向帐户添加外部登录名时,将使用此功能。 OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>( validateInterval: TimeSpan.FromMinutes(30), regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) } });
上面这段代码中LoginPath这个变量就是指向我们的登陆页面,我们可以更改后面的“/Account/Login”来更改指向。Startup.Auth.cs文件我也不是很清楚,后续我应该还会针对此文件来更新文章。
然后是登陆view的代码
1 @model Access_Control_System.Models.Login 2 @{ 3 ViewBag.Title = "View"; 4 } 5 6 <h2>Login</h2> 7 8 @using (Html.BeginForm()) 9 { 10 @Html.AntiForgeryToken(); 11 @Html.ValidationSummary(true,"",new { @class="text-danger"}) 12 <fieldset class="form-horizontal"> 13 <div class="form-group"> 14 @Html.LabelFor(model=>model.UserName,htmlAttributes:new {@class="control-label col-md-2"}) 15 <div class="col-md-10"> 16 @Html.EditorFor(model=>model.UserName,new { htmlAttributes=new { @class="form-control"} }) 17 @Html.ValidationMessageFor(model=>model.UserName,"",new {@class="text-danger"}) 18 </div> 19 </div> 20 <div class="form-group"> 21 @Html.LabelFor(model=>model.Password, htmlAttributes: new { @class = "control-label col-md-2" }) 22 <div class="col-md-10"> 23 @Html.EditorFor(model=>model.Password,new { htmlAttributes=new { @class="form-control"} }) 24 @Html.ValidationMessageFor(model=>model.UserName,"",new { @class="text-danger"}) 25 </div> 26 </div> 27 28 29 <div class="form-group"> 30 <div class="col-md-offset-2 col-md-10"> 31 <input type="submit" value="Submit" class="btn btn-default" /> 32 </div> 33 </div> 34 35 </fieldset> 36 37 }
asp.net mvc 登陆实现