asp.net中使用Forms身份認(rèn)證常見(jiàn)的做法如下:
1. 網(wǎng)站根目錄下的Web.config添加authentication節(jié)點(diǎn)
<authentication mode="Forms"> <forms name="MyAuth" loginUrl="manager/Login.aspx" defaultUrl="manager/default.aspx"2. 在manager子目錄下添加Web.config文件并加入下面的內(nèi)容:
<?xml version="1.0"?><configuration> <system.web> <authorization> <allow roles="Admin" /> <deny users="*" /> </authorization> </system.web></configuration>這樣,用戶在沒(méi)有Forms認(rèn)證的情況下訪問(wèn)manager子目錄下的任何頁(yè)面均會(huì)自動(dòng)跳轉(zhuǎn)到manager/Login.aspx頁(yè)面。如果認(rèn)證成功,則會(huì)默認(rèn)回到manager/default.aspx頁(yè)面。認(rèn)證有效期為60分鐘。
3. 添加認(rèn)證代碼。登錄按鈕中添加下面的代碼:
if (!snCheckCode.CheckSN(txt_ValidateCode.Text)){ snCheckCode.Create(); Utility.ShowMessage("校驗(yàn)碼錯(cuò)誤!"); return;}string strUserName = txt_Username.Text.Trim();string md5Pwd = Helper.MD5Forphp(Helper.MD5ForPHP(txt_PassWord.Text));lc_admin admin = null;bool logined = false;using (var context = new dbEntities()){ admin = context.tb_admin.Where(n => n.username == strUserName).FirstOrDefault(); if (admin != null) { if (admin.checkadmin != "true") { snCheckCode.Create(); Utility.ShowMessage("抱歉,該賬號(hào)被禁止登錄!"); return; } if (admin.password == md5Pwd) { // Update Admin Info admin.loginip = Request.UserHostAddress.ToString(); admin.logintime = CndingUtility.DateTimeToUnixTimeStamp(DateTime.Now); context.SaveChanges(); logined = true; } }}if (logined){ // Login FormsAuthenticationTicket ticket = new FormsAuthenticationTicket( 1, admin.id.ToString(), DateTime.Now, DateTime.Now.AddMinutes(60), false, "Admin", FormsAuthentication.FormsCookiePath ); string hashTicket = FormsAuthentication.Encrypt(ticket); HttpCookie userCookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashTicket); HttpContext.Current.Response.Cookies.Add(userCookie); if (Request["ReturnUrl"] != null) { Response.Redirect(HttpUtility.HtmlDecode(Request["ReturnUrl"])); } else { Response.Redirect("/manager/default.aspx"); }}else{ snCheckCode.Create(); CndingUtility.ShowMessage("用戶名或密碼不正確!");}MD5加密代碼:
public static string MD5ForPHP(string stringToHash){ var md5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); byte[] emailBytes = Encoding.UTF8.GetBytes(stringToHash.ToLower()); byte[] hashedEmailBytes = md5.ComputeHash(emailBytes); StringBuilder sb = new StringBuilder(); foreach (var b in hashedEmailBytes) { sb.Append(b.ToString("x2").ToLower()); } return sb.ToString();}認(rèn)證成功后默認(rèn)會(huì)將用戶登錄信息以Cookie的形式存放到客戶端,有效期為60分鐘。UserData被設(shè)置為用戶的角色,在判斷用戶是否登錄時(shí)會(huì)用到。如下面的代碼:
if (HttpContext.Current.User.Identity.IsAuthenticated){ int adminId = -1; FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity; FormsAuthenticationTicket ticket = identity.Ticket; string userData = ticket.UserData; if (userData == "Admin") { // To do something }}上述代碼在Visual Studio中運(yùn)行一切正常!但是將網(wǎng)站發(fā)布到服務(wù)器的IIS (可能會(huì)是較低版本的IIS,如IIS 6)后,發(fā)現(xiàn)登錄功能異常。輸入用戶名和密碼后點(diǎn)擊登錄按鈕,頁(yè)面postback但并不能正確跳轉(zhuǎn),嘗試手動(dòng)訪問(wèn)受保護(hù)的頁(yè)面會(huì)被自動(dòng)跳轉(zhuǎn)回登錄頁(yè)面。更奇怪的是該問(wèn)題只出現(xiàn)在IE11瀏覽器上,嘗試用Firefox或Chrome訪問(wèn)登錄功能運(yùn)行正常。初步懷疑是IIS設(shè)置的問(wèn)題,可是IIS 6上并沒(méi)有與Cookie相關(guān)的設(shè)置,好像記得IIS 7上倒是有這個(gè)設(shè)置。但因?yàn)橹挥蠭E 11存在該問(wèn)題,所以可以否定代碼本身存在任何問(wèn)題。
此外,還嘗試了降低IE 11的安全級(jí)別,重新安裝服務(wù)器上的.net framework以及下載最新的補(bǔ)丁等等,均不能解決問(wèn)題。后來(lái)發(fā)現(xiàn)其實(shí)只需要簡(jiǎn)單修改Web.config中authentication節(jié)點(diǎn)的設(shè)置就可以了,給forms添加cookieless="UseCookies"屬性即可。
<authentication mode="Forms"> <forms name="MyAuth" cookieless="UseCookies" loginUrl="manager/Login.aspx" defaultUrl="manager/default.aspx" protection="All" timeout="60" /></authentication>用以明確告訴服務(wù)器使用Cookie來(lái)保存用戶驗(yàn)證信息。問(wèn)題解決!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注