Maison  >  Article  >  développement back-end  >  Exemple d'implémentation du processus d'authentification par formulaires dans asp.net mvc

Exemple d'implémentation du processus d'authentification par formulaires dans asp.net mvc

黄舟
黄舟original
2018-05-14 13:48:534094parcourir

Cet article présente principalement le processus d'authentification par formulaires dans asp.net MVC. L'éditeur pense qu'il est plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence. Suivons l'éditeur pour jeter un œil

Processus de vérification

Connexion de l'utilisateur

1. Formulaire : ModelState.IsValid
2. Vérifiez le nom d'utilisateur et le mot de passe : Vérifiez en interrogeant la base de données
3 Si le nom d'utilisateur et le mot de passe sont corrects, enregistrez le cookie sur le client pour enregistrer l'état de connexion de l'utilisateur : SetAuthCookie
. 1) : Recherchez le nom d'utilisateur et certaines informations nécessaires dans la base de données, puis enregistrez les informations supplémentaires dans UserData
 2) : Enregistrez le nom d'utilisateur et les données utilisateur dans le ticket FormsAuthenticationTicket
 3) : Chiffrez le ticket Chiffrez
4) : Enregistrez le ticket crypté dans Cookie et envoyez-le au client
4. Accédez à la page avant de vous connecter
5 Si la connexion échoue, revenez à la vue actuelle

<.>2, Vérifiez la connexion

1. Enregistrez la fonction d'événement PostAuthenticateRequest dans Global pour analyser les données de cookie envoyées par le client

1) : Jugez par HttpContext.Current.User. Identité Si l'utilisateur est connecté (FormsIdentity, IsAuthenticated, AuthenticationType)
 2) : Analysez la valeur du cookie de la requête du HttpContext, déchiffrez-la pour obtenir le FormsAuthenticationTicket et obtenez la vérification du rôle UserData
2.
1) : Ajoutez la fonctionnalité Authorize à l'Action, la vérification du rôle peut être effectuée
2) : Effectuez l'authentification du rôle dans la méthode IsInRole de HttpContext.Current.User (doit être réécrit)

1. Connexion de l'utilisateur

1. Définir web.config

Définir la page de connexion de redirection

<system.web>
<authentication mode="Forms">
  <forms name="loginName" loginUrl="/UserInfo/login" cookieless="UseCookies" path="/" protection="All" timeout="30"></forms>
</authentication>
</system.web>
Commenter

<modules>
  <!--<remove name="FormsAuthentication" />-->
</modules>

2. Connexion La méthode modifiée avec "[Authorize]" dans le contrôleur

lors de la vérification refuse l'anonymat.

 public class UserInfoController : Controller //控制器
 {
 //身份验证过滤器
  [Authorize]
  public ActionResult Index()
  {
   return View();
  }
 }
Connectez-vous au contrôleur

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

   }
Cookiez le compte de connexion

  /// <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.Ajoutez des fichiers de modèle dans Modèles

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

4. Code de connexion dans Views :

Copier le code Le code est le suivant :

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

5. Paramètres globaux

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. Déconnexion

Dans le contrôleur

  /// <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");
 
  }
Afficher le lien de saut

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn