服务器之家

服务器之家 > 正文

asp.net mvc中Forms身份验证身份验证流程

时间:2020-05-16 16:59     来源/作者:关注该用户太懒还没想好

验证流程

一、用户登录

1、验证表单:ModelState.IsValid
2、验证用户名和密码:通过查询数据库验证
3、如果用户名和密码正确,则在客户端保存Cookie以保存用户登录状态:SetAuthCookie
    1):从数据库中查出用户名和一些必要的信息,并把额外信息保存到UserData中
 2):把用户名和UserData保存到 FormsAuthenticationTicket 票据中
 3):对票据进行加密 Encrypt
 4):将加密后的票据保存到Cookie发送到客户端
4、跳转到登录前的页面
5、如果登录失败,返回当前视图

二、验证登录

1、在Global中注册PostAuthenticateRequest事件函数,用于解析客户端发过来的Cookie数据
 1):通过 HttpContext.Current.User.Identity 判断用户是否登录(FormsIdentity,IsAuthenticated,AuthenticationType)
 2):从HttpContext 的Request的Cookie中解析出Value,解密得到 FormsAuthenticationTicket 得到UserData
2、角色验证
 1):在Action加入 Authorize特性,可以进行角色验证
 2):在 HttpContext.Current.User 的 IsInRole 方法进行角色认证(需要重写)

一、用户登录

1、设置web.config

设置重定向登录页面

?
1
2
3
4
5
<system.web>
<authentication mode="Forms">
  <forms name="loginName" loginUrl="/UserInfo/login" cookieless="UseCookies" path="/" protection="All" timeout="30"></forms>
</authentication>
</system.web>

注释掉

?
1
2
3
<modules>
  <!--<remove name="FormsAuthentication" />-->
</modules>

2、登陆的验证中控制器

控制器中加“[Authorize]”修饰的方法拒绝匿名。

?
1
2
3
4
5
6
7
8
9
public class UserInfoController : Controller //控制器
{
//身份验证过滤器
 [Authorize]
 public ActionResult Index()
 {
  return View();
 }
}

控制器中登录

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/// <summary>
/// 用户登录
/// </summary>
/// <returns></returns>
public ActionResult login()
{
 return View();
[HttpPost]
public ActionResult login(loginModels login) {
 if (ModelState.IsValid)
 {
  var model = db.Admininfo.FirstOrDefault(a => a.AdminAccount == login.AdminAccount && a.AdminPwd == login.AdminPwd);
  if (model != null)
  {
   //存入票据(用户登录的时候去存信息,如果有信息直接去登录)
   var dtoModel = new Users
   {
    id = model.id,
    AdminPwd = model.AdminPwd,
    AdminAccount=model.AdminAccount
   };
   //调用
   SetAuthCookie(dtoModel);
   //获取登录地址
   var returnUrl = Request["ReturnUrl"];
   //判断登录地址是不是空值
   if (!string.IsNullOrWhiteSpace(returnUrl))
   {     
    return Redirect(returnUrl);
   }
   else
   {
    //return RedirectiToAction
    return Redirect("/Home/index");
   }
 
  }
  else
  {
   ModelState.AddModelError("", "账号密码不对");
   return View(login);
  }
 }
 else
 {
  ModelState.AddModelError("", "输入的信息有误");
  return View(login);
 
 }

对登录账号进行cookie

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/// <summary>
/// 对登录账号进行cookie
/// </summary>
/// <param name="model"></param>
public void SetAuthCookie(Users loginModel) {
 //1、将对象转换成json
 var userdata = loginModel.ToJson();
 //2、创建票据FormsAuthenticationTicket
 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2,"loginUser",DateTime.Now,DateTime.Now.AddDays(1), false, userdata);
 //对票据进行加密
 var tickeEncrypt = FormsAuthentication.Encrypt(ticket);
 //创建Cookie,定义
 HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, tickeEncrypt);
 cookie.HttpOnly = true;
 cookie.Secure = FormsAuthentication.RequireSSL;
 cookie.Domain = FormsAuthentication.CookieDomain;
 cookie.Path = FormsAuthentication.FormsCookiePath;
 cookie.Expires = DateTime.Now.Add(FormsAuthentication.Timeout);
 //先移除cookie,在添加cookie
 Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
 Response.Cookies.Add(cookie);
}

3、Models中添加模型文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class loginModels
{
 /// <summary>
 /// 账号
 /// </summary>
 [DisplayName("账号")]
 [Required(ErrorMessage = "账号不能为空")]
 public string AdminAccount { get; set; }
 /// <summary>
 /// 密码
 /// </summary>
 [DisplayName("密码")]
 [Required(ErrorMessage = "密码不能为空")]
 public string AdminPwd { get; set; }
}

4、Views中 Login 代码:

 

复制代码 代码如下:

@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))

 

5、Global设置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
protected void Application_AuthenticateRequest(object sender, EventArgs e)
  {
   //1、通过sender获取http请求
   // HttpApplication app = new HttpApplication();//实例化
   HttpApplication app = sender as HttpApplication;
   //2、拿到http上下文
   HttpContext context = app.Context;
   //3、根据FormsAuthe,来获取cookie
   var cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName];
   if (cookie != null)
   {
    //获取cookie的值
    var ticket = FormsAuthentication.Decrypt(cookie.Value);
    if (!string.IsNullOrWhiteSpace(ticket.UserData))
    {
     //把一个字符串类别变成实体模型
     var model = ticket.UserData.ToObject<AdmininfoViewModel>();
     //var acount = model.AdminAccount; //获取账号
     context.User = new MyFormsPrincipal<AdmininfoViewModel>(ticket, model);
     //MyFormsPrincipal.Identity = new FormsIdentity(ticket);
     // MyFormsPrincipal.userdata;
 
    }
   }
  }

6、退出登录

控制器中

?
1
2
3
4
5
6
7
8
9
10
11
12
13
/// <summary>
/// 退出登录
/// </summary>
public ActionResult loginout()
{
 //删除票据
 FormsAuthentication.SignOut();
 //清除cookie
 Response.Cookies[FormsAuthentication.FormsCookieName].Expires = DateTime.Now.AddDays(-1);
 Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
 return RedirectToAction("Index", "Home");
 
}

View跳转链接

?
1
@Html.ActionLink("安全退出","loginout","Users")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://www.jianshu.com/p/d188bb8814f8

相关文章

热门资讯

歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意
沙雕群名称大全2019精选 今年最火的微信群名沙雕有创意 2019-07-07
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
返回顶部