asp.net mvc에서 양식 인증 인증 프로세스를 구현하는 예

黄舟
풀어 주다: 2018-05-14 13:48:53
원래의
4168명이 탐색했습니다.

이 글은 주로 asp.net MVC의 Forms 인증 프로세스를 소개합니다. 편집자는 이것이 꽤 좋다고 생각합니다. 이제 공유하고 참고용으로 제공하겠습니다. 편집자를 따라가서 살펴보겠습니다

확인 과정

1. 사용자 로그인

1. 확인 양식: ModelState.IsValid
2. 사용자 이름과 비밀번호 확인: 데이터베이스를 쿼리하여 확인합니다
3. 사용자의 이름과 비밀번호가 정확하다면 클라이언트에 쿠키를 저장하여 사용자 로그인 상태를 저장합니다: SetAuthCookie
1): 데이터베이스에서 사용자 이름과 필요한 정보를 찾아 UserData
 2에 저장합니다. ): FormsAuthenticationTicket 티켓에 사용자 이름과 UserData를 저장
 3): 티켓을 암호화
 4): 암호화된 티켓을 쿠키에 저장하고 클라이언트로 전송
4. 로그인에 실패하면 해당 페이지로 이동합니다. 현재 뷰로 돌아갑니다

2. 로그인 확인


1. PostAuthenticateRequest 이벤트 함수를 Global에 등록하여 클라이언트가 보낸 쿠키 데이터를 구문 분석합니다

 1): HttpContext.Current를 통해 사용자가 로그인되었는지 확인합니다. .User.Identity (FormsIdentity, IsAuthenticated, AuthenticationType)

 2): HttpContext의 요청 쿠키에서 값을 구문 분석하고 이를 해독하여 FormsAuthenticationTicket을 가져오고 UserData
2, 역할 확인
 1): Action에 Authorize 기능을 추가합니다. 역할 확인을 수행할 수 있습니다
 2): HttpContext에서 Current.User의 IsInRole 메소드는 역할 인증을 수행합니다(다시 작성해야 함)

1. 사용자 로그인

1 web.config 설정

리디렉션 로그인 페이지 설정

<system.web>
<authentication mode="Forms">
  <forms name="loginName" loginUrl="/UserInfo/login" cookieless="UseCookies" path="/" protection="All" timeout="30"></forms>
</authentication>
</system.web>
로그인 후 복사

댓글 달기

<modules>
  <!--<remove name="FormsAuthentication" />-->
</modules>
로그인 후 복사

2. 로그인 인증 컨트롤러

에서 컨트롤러의 "[Authorize]"로 수정된 메소드는 익명성을 거부합니다.

 public class UserInfoController : Controller //控制器
 {
 //身份验证过滤器
  [Authorize]
  public ActionResult Index()
  {
   return View();
  }
 }
로그인 후 복사

컨트롤러에 로그인

   /// <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);

   }
로그인 후 복사

로그인 계정을 쿠키로 만드세요

  /// <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에 모델 파일을 추가하세요

 public class loginModels
 {
  /// <summary>
  /// 账号
  /// </summary>
  [DisplayName("账号")]
  [Required(ErrorMessage = "账号不能为空")] 
  public string AdminAccount { get; set; }
  /// <summary>
  /// 密码
  /// </summary>
  [DisplayName("密码")]
  [Required(ErrorMessage = "密码不能为空")]
  public string AdminPwd { get; set; }
 }
로그인 후 복사

4. 뷰에 로그인 코드:

코드를 복사하세요

:

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

5. 전역 설정

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. 로그아웃

컨트롤러에서

  /// <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");
 
  }
로그인 후 복사

이동 링크 보기

@Html.ActionLink("安全退出","loginout","Users")
로그인 후 복사

위 내용은 asp.net mvc에서 양식 인증 인증 프로세스를 구현하는 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿