ASP.NET中cookie與Fiter實現簡單登陸,AllowAnonymous匿名登陸

來源:互聯網
上載者:User

標籤:error   date   getc   att   還需要   ctr   判斷   username   還需   

向伺服器發送cookie

在登陸的時候,我們可以可以通過下列代碼,向伺服器發送cookie,其中包括自己的帳號資訊(不涉及加密),用以後面判斷訪問者.

1 HttpCookie cookie = new HttpCookie("userinfo");//建立一個名為userinfo的cookie2 cookie.Values["UserName"] = username;//向cookie中加入帳號資訊3 cookie.Values["PassWord"] = userpassword;//向cookie中加入密碼資訊4 cookie.Expires = DateTime.MaxValue;//設定cookie的可存在的時間,這裡設的最長時間,cookie.Expires = System.DateTime.Now.AddDays(1);//設定存在時間1天5 Response.Cookies.Add(cookie);//寫入cookie

過濾器Filter

並不是只有登入時我們才需要請求響應cookie,其實我們在訪問任何一個頁面的時候,都需要驗證cookie資訊,判斷當前訪問該頁面的訪問者,那麼理論上,每一個控制器,每一個action,我們都需要寫入關於cookie的代碼,如此龐大的工作量,顯然是不可能的.通過過濾器filter,這個問題引刃而解.

首先我們自訂一個過濾器

 1       public class CheckLogin : ActionFilterAttribute 2       { 3           public override void OnActionExecuted(ActionExecutedContext filterContext) 4          { 5              HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("userinfo");//擷取當前請求的所有cookie中名為userinfo的cookie 6   7             if (cookie==null||cookie.Values["UserName"] == null || cookie.Values["PassWord"] == null)//判斷帳號密碼資訊 8             { 9                  filterContext.Result = new RedirectResult("/Account/Login");//若帳號密碼為null或者cookie不存在,即返回登入頁面10              }11         }12      }13  }

 這個過濾器放在控制器或者action上面都可以實現驗證cookie的作用,可是需要作用的控制器和action數量太多,我們就需要將該過濾器作用到全域,對所有的控制器作用.

 1     public class FilterConfig 2     { 3         public static void RegisterGlobalFilters(GlobalFilterCollection filters) 4         { 5         6             filters.Add(new HandleErrorAttribute()); 7             filters.Add(new CheckLogin.CheckLogin()); 8         } 9     }10 }
1     public class MvcApplication : System.Web.HttpApplication2     {3         protected void Application_Start()4         {5             FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);6         }7     }8 }

 匿名訪問

按照上述代碼進行登陸操作,你會發現,根本找不到登入頁面,原因在於,上述全域作用的過濾器,連登入頁面都沒有放過,就是說,你連進入登陸頁面都還需要驗證資訊,沒有資訊你就返回登入頁,可是登陸頁你也無法訪問.最後就報錯.

所以對於某些特定的頁面,我們需要能夠匿名訪問,這也是一個很實際問題,很多網頁我們不需要登陸可以很輕鬆的訪問.

對於匿名訪問我們需要用到: [AllowAnonymous],能夠跳過驗證,實現匿名訪問.

 1    public class CheckLogin : ActionFilterAttribute 2     { 3         public override void OnActionExecuted(ActionExecutedContext filterContext) 4         { 5             var actionFilters = filterContext.ActionDescriptor.GetCustomAttributes(false);//擷取所有的描述符 6  7             foreach (var item in actionFilters) 8             { 9                 if (item.GetType().Name == "AllowAnonymousAttribute")//如果描述符類型中有AllowAnonymousAttribute(AllowAnonymous類型的名字),就直接存取,不需要驗證10                 {11                     return;12                 }13             }          14             HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("userinfo");//擷取當前請求的所有cookie中名為userinfo的cookie15 16             if (cookie==null||cookie.Values["UserName"] == null || cookie.Values["PassWord"] == null)//判斷帳號密碼資訊17             {18                 filterContext.Result = new RedirectResult("/Account/Login");//若帳號密碼為null或者cookie不存在,即返回登入頁面19             }20         }21     }

 這樣,我們就可以實現匿名登入,不需要驗證cookie,就可以登陸一些頁面.

 最後,對於需要驗證當前訪問者的資訊,那麼根據取到的cookie中的帳號資訊,很容易就可以在資料庫中找到,這裡就不予說明.另外,登出帳號,也可以通過到期cookie實現.

ps:才接觸電腦程式,也是第一次寫部落格.感覺寫部落格是很有必要的,這是一個思考學習的過程,解決問題並不是結束,能夠把它寫下來,講解給別人去解決問題,才是一個完美的結束!不過很遺憾,這次我沒有做到!功力有限,積極極受大家的指正批評!

 參考內容:

http://blog.csdn.net/jin3226390/article/details/3245519(cookie的操作詳解)

http://www.cnblogs.com/kissdodog/archive/2013/01/21/2869298.html(MVC自訂過濾器)

  

 

ASP.NET中cookie與Fiter實現簡單登陸,AllowAnonymous匿名登陸

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.