---------- 20190205 【ASP.net MVC】揭開WebSecurity的神秘面紗! ref: https://dotblogs.com.tw/mantou1201/2013/06/06/105322 傳統FormsAuthentication驗證的寫法: public void SetLoginStatus(MemberTable MemberData,LogInModel UserData) { String UserName = (MemberData.Anonymous == null ? MemberData.RealName : MemberData.Anonymous); //設定認證cookie FormsAuthentication.SetAuthCookie(UserName, UserData.RememberMe); //設定其他cookie資料 HttpCookie Cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.GetAuthCookie(UserName, UserData.RememberMe).Value); //記得我勾選 if (UserData.RememberMe) Cookie.Expires = DateTime.MaxValue; //存入cookie HttpContext.Current.Response.Cookies.Add(Cookie); //設定Email在cookie中 HttpContext.Current.Response.Cookies.Add(new HttpCookie("UserEmail",MemberData.Email)); } 【ASP.net MVC】揭開WebSecurity的神秘面紗! 一開始MVC中就內建了一個登入的方式,就是WebSecurity的類別;以前在做登入的時候,都會利用FormsAuthentication類別來處理登入的認證狀態,這個類別就變得很少人使用...但其實這個類別,更容易做登入登出的驗證! 傳統FormsAuthentication驗證的寫法: 如果我們改成利用WebSecurity的方法呢? 首先,我們要先將WebSecurity初始化 一開始MVC中就內建了一個登入的方式,就是WebSecurity的類別;以前在做登入的時候,都會利用FormsAuthentication類別來處理登入的認證狀態,這個類別就變得很少人使用...但其實這個類別,更容易做登入登出的驗證! 傳統FormsAuthentication驗證的寫法: public void SetLoginStatus(MemberTable MemberData,LogInModel UserData) { String UserName = (MemberData.Anonymous == null ? MemberData.RealName : MemberData.Anonymous); //設定認證cookie FormsAuthentication.SetAuthCookie(UserName, UserData.RememberMe); //設定其他cookie資料 HttpCookie Cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.GetAuthCookie(UserName, UserData.RememberMe).Value); //記得我勾選 if (UserData.RememberMe) Cookie.Expires = DateTime.MaxValue; //存入cookie HttpContext.Current.Response.Cookies.Add(Cookie); //設定Email在cookie中 HttpContext.Current.Response.Cookies.Add(new HttpCookie("UserEmail",MemberData.Email)); } 如果我們改成利用WebSecurity的方法呢? 首先,我們要先將WebSecurity初始化 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public sealed class InitializeSimpleMembershipAttribute : ActionFilterAttribute { private static SimpleMembershipInitializer _initializer; private static object _initializerLock = new object(); private static bool _isInitialized; public override void OnActionExecuting(ActionExecutingContext filterContext) { // 請確定一個應用程式啟動只起始一次 ASP.NET Simple Membership LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock); } private class SimpleMembershipInitializer { public SimpleMembershipInitializer() { //初始化資料庫連線 Database.SetInitializer(null); try { using (var context = new UsersContext()) { //檢查資料庫是否正處於可連線狀態 if (!context.Database.Exists()) { // 建立沒有 Entity Framework 移轉結構描述的 SimpleMembership 資料庫 ((IObjectContextAdapter)context).ObjectContext.CreateDatabase(); } } //假設資料表不存在時,自動建立 WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true); } catch (Exception ex) { throw new InvalidOperationException("無法起始 ASP.NET Simple Membership 資料庫。如需詳細資訊,請參閱 http://go.microsoft.com/fwlink/?LinkId=256588", ex); } } } } 登入之前,需要先註冊 CreateUserAndAccount,就可以建立新用戶,達到會員註冊的功能! WebSecurity.CreateUserAndAccount(RegisterData.Email, RegisterData.Password); 登入 WebSecurity.Login(RegisterData.Email, RegisterData.Password); 登出 WebSecurity.Logout(); ---------- 20181203 ref: https://toyo0103.blogspot.com/2013/09/cformsauthentication.html 1. 使用這個方法即表示驗證成功,這個驗證會記錄在電腦的cookie當中 FormsAuthentication.RedirectFromLoginPage(strUsername, false); 2. 但如果你想要關閉瀏覽器時就登出,你就得改用以下方式將cookie記錄在web browser當中 //改發Ticket的方式 FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, username, DateTime.Now, DateTime.Now.AddMinutes(30), false, userdata, FormsAuthentication.FormsCookiePath); // Encrypt the ticket. string encTicket = FormsAuthentication.Encrypt(ticket); // Create the cookie. Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket)); 3. 那如果又要實作,記住我xx天不用重新登入的功能呢? //除了剛剛發Ticket之外 if (bool.Parse(remember)) { //如果打勾記住我的話 HttpCookie cookie = new HttpCookie("rememberme"); cookie.Value = SysHelper.enCrypt(account); cookie.Expires = DateTime.Now.AddDays(3); Response.Cookies.Add(cookie); } 這樣下次登入的時候只要判斷這個cookie存不存在就可以放行了!! //登入Login頁面時,先判斷Form驗證已經通過了嗎? if (!User.Identity.IsAuthenticated) { //沒通過的話,判斷cookie存不存在。有的話表示此人上次登入時有勾記住我!! if ( Request.Cookies["backend"] != null) { //cookie如果過期的話會判斷為null,所以進得來表示cookie還沒過期,可以發Ticket給他 passTicket(SysHelper.deCrypt(Request.Cookies["rememberme"].Value), ""); return Redirect("/backend"); } return View(); } 4. 登出 //呼叫這個方法就已經登出摟~ FormsAuthentication.SignOut(); if (Request.Cookies["backend"] != null) { //如果cookie還沒過期,既然已經登出當然要把它重新設定為過期啦!! HttpCookie myCookie = new HttpCookie("backend"); myCookie.Expires = DateTime.Now.AddDays(-1d); Response.Cookies.Add(myCookie); } return Redirect("/backend");