首页 > 代码库 > 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 登陆实现