中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

三、Asp.Net MVC4.0開發CMS系統案例之用戶登錄模塊開發

發布時間:2020-09-30 22:22:16 來源:網絡 閱讀:3288 作者:sujerhy 欄目:編程語言

    本次開發是將三層架構與MVC結合一起來,我們看下面一個系統結構:

    View ->Contraller->Model->BLL->DAL->SQLSERVER

             |        |        |

             ----------->Extensions----->FrameWork

             |

             __>Common


    Extensions包括擴展類功能,例如控件的再重新,權限的重新驗證等。Common是一些公共×××。


    第一步:創建用戶登錄模型,可以與注冊模型類(SysComUerRegister),用戶模型(SysComUser)寫入同一個文件中。

    /// <summary>
    /// 用戶登錄
    /// </summary>
    ///子類并不映射到任何數據庫,加上一個不映射的屬性[NotMapped]
    [NotMapped]
    public class SysComUserLogin
    {

        [Display(Name = "登錄名", Description = "4-20個字符")]
        [Required(ErrorMessage = "×")]
        [StringLength(20, MinimumLength = 4, ErrorMessage = "×")]
        public string LoginName { get; set; }

        [Display(Name = "登錄密碼", Description = "6-20個字符")]
        [Required(ErrorMessage = "×")]
        [StringLength(20, MinimumLength = 6, ErrorMessage = "×")]
        [DataType(DataType.Password)]
        public new string Password { get; set; }

        [Display(Name = "驗證碼", Description = "請輸入驗證碼!")]
        [Required(ErrorMessage = "×")]
        [StringLength(4, MinimumLength = 4, ErrorMessage = "×")]
        public string VerificationCode { get; set; }
    }

    第二步:控制器Conrallers方法的實現。這里我們考慮有三個:一個是默認的登錄頁面方法,一個是HTTPPOST提交登錄數據的方法,還有一個注銷的方法。如下:

        /// <summary>
        /// 用戶登錄頁面
        /// </summary>
        /// <returns></returns>
        public ActionResult UserLogin()
        {
            return View();
        }

        /// <summary>
        /// 用戶提交登錄
        /// </summary>
        /// <param name="userLogin"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult UserLogin(SysComUserLogin userLogin)
        {
            //說明:因為在Models中,已經實現用戶名和密碼驗證規則,因為這里不需要重復判斷了,但驗證碼除外,因為它是保存Session緩存中.
            if (String.IsNullOrEmpty(Session["VerificationCode"].ToString()))
            {
                ModelState.AddModelError("VerificationCode", "×");
                return View();
            }
            else if (Session["VerificationCode"].ToString() != userLogin.VerificationCode)
            {
                ModelState.AddModelError("VerificationCode", "×");
                return View();
            }
            else
            {
                if (userRpy.Authentication(userLogin.LoginName,userLogin.Password) == 0)
                {
                    HttpCookie _cookie = new HttpCookie("user");
                    _cookie.Values.Add("loginname", userLogin.LoginName);
                    _cookie.Values.Add("password", userLogin.Password);
                    Response.Cookies.Add(_cookie);
                    ModelState.AddModelError("Message", "登陸成功!!");
                    return View();
                }
                else
                {
                    ModelState.AddModelError("Message", "登陸失敗!");
                    return View();

                }
            }

        }


        /// <summary>
        /// 注銷登錄信息
        /// </summary>
        /// <returns>URL</returns>
        public ActionResult UserLoginOut()
        {
            HttpCookie _cookie = HttpContext.Request.Cookies["user"];
            if (_cookie != null)
            {
                //失效時間
                _cookie.Expires = DateTime.Now.AddHours(-1);
                Response.Cookies.Add(_cookie);
            }
            return View();
        }

    這里面用到一個Authentiction()用戶身份驗證方法,所以需要在BLL業務層實現。


    第三步:BLL業務邏輯層方法實現

        /// <summary>
        /// 用戶登錄身份驗證
        /// </summary>
        /// <param name="loginName">登錄名</param>
        /// <param name="password">密碼</param>
        /// <returns>0:登錄成功;1:登錄名不存在;2:密碼錯誤</returns>
        public int Authentication(string loginName, string password)
        {
            var _user = HillstoneContext.SysComUser.SingleOrDefault(u=>u.LoginName==loginName);
            if (_user == null) { return 1; }
            if (_user.Password != password) { return 2; }
            return 0;
        }

    第四步:所有涉及的東西都寫完了,下面就是實現VIEW了。如下:

@model Hillstone.Models.SysComUserLogin

@{
    ViewBag.Title = "用戶登錄";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h3>UserLogin</h3>

@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>SysComUserLogin</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.LoginName)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.LoginName)
            @Html.ValidationMessageFor(model => model.LoginName)
            @Html.DisplayDescriptionFor(model=>model.LoginName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Password)
        </div>
        <div class="editor-field">
            @Html.PasswordFor(model => model.Password)
            @Html.DisplayDescriptionFor(model => model.LoginName)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.VerificationCode)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.VerificationCode)
            @Html.ValidationMessageFor(model => model.VerificationCode)
             <img id="verificationcode" alt="" src="@Url.Action("VerificationCode", "SysComUser")" /> 
             <a id="trydifferent" >換一張</a> 
        </div>

        <p>
            <input type="submit" value="Save" />@Html.ValidationMessage("Message")
        </p>
    </fieldset>
}

<div>

    @Html.ActionLink("Back to List", "Index")
</div>
<script type="text/javascript" >
    function VerificationChange() {
        $("#verificationcode").attr("src", "/SysComUser/VerificationCode?" + new Date());
    }
   
</script>
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

    第五部:其他考慮,我們登錄后,每次頁面跳轉或者刷新,需要確認身份是否失效或者有效,那么問題就來了,是不是在所有的頁面請求Contraller時候都要調用BLL中的Authencation()方法來驗證呢?其實系統默認有驗證機制類庫,我們可以重新寫這個接口,使用起來更加簡潔方面,提交我們的開發效率。所以我做個擴展,在Extensions文件夾中新建UserAuthorizeAttribute.cs類。如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Hillstone.BLL;

namespace System.Web.Mvc
{
    /// <summary>
    /// 用戶權限驗證
    /// </summary>
    public class UserAuthorizeAttribute:AuthorizeAttribute
    {
        /// <summary>
        ///  核心【驗證用戶是否登錄】以后只要在需要登錄后才能操作的Action或Controller上加[UserAuthorize]就可實現驗證是否已經登錄了。
        /// </summary>
        /// <param name="httpContext">HTTP請求</param>
        /// <returns>布爾值:True or False</returns>
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext.Request.Cookies["user"] == null) return false;
            HttpCookie _cookie = httpContext.Request.Cookies["user"];

            string _loginName = _cookie["loginname"];
            string _password = _cookie["password"];

            httpContext.Response.Write("登錄名:" + _loginName);

            if (string.IsNullOrEmpty(_loginName) || string.IsNullOrEmpty(_password)) return false;

            SysComUserRepository userRsy = new SysComUserRepository();
            if (userRsy.Authentication(_loginName, _password) == 0) return true;
            else return false;
        }
    }
}

   繼承AuthorizeAttribute類庫,這里做AuthorizeCore方法重寫,里面調用BLL中的Authencation()登錄驗證方法。 以后所有需要登錄之后才能操作的Contraller中,在Action之前加上[UserAuthorize]即可。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

偏关县| 陆良县| 嵊州市| 栾城县| 唐河县| 永川市| 宝丰县| 焦作市| 奉贤区| 桦南县| 斗六市| 申扎县| 洱源县| 监利县| 南安市| 葵青区| 鹤峰县| 吉木萨尔县| 宜都市| 武威市| 拜泉县| 电白县| 西吉县| 东乌珠穆沁旗| 新闻| 翁牛特旗| 若尔盖县| 体育| 乐都县| 红桥区| 健康| 墨竹工卡县| 奎屯市| 游戏| 眉山市| 九寨沟县| 理塘县| 吴川市| 新沂市| 吕梁市| 清涧县|