Forms驗證中的roles

來源:互聯網
上載者:User
    一直對forms驗證中的角色很模糊,不知道怎麼搞,昨天晚上仔細看了下csdn的雜誌,心裡稍微有點底,今天早晨一上csdn,就看到思歸大人回的一篇貼,是關於asp.net中的forms驗證roles,地址是:http://www.codeproject.com/aspnet/formsroleauth.asp
汗,怎麼是E文,我的e文特差,但是不知道為什麼這次竟然被我看懂了,模仿他的做,竟然成功!,特把過程以及我的理解寫出來,希望對和我一樣的菜鳥有點協助,同時我的一些理解可能錯誤,希望各位老大們能夠指出,非常感謝,下面我開始邊翻譯邊按照他的做:
1,首先我們建立一個資料庫,名字叫web,添加一個表叫users,裡面有三個欄位,username欄位為主鍵,username和password欄位設定為聯合索引,不知道我這樣理解對麼?請指正
CREATE
DATABASE web

CREATE TABLE users
(
username nvarchar(64) CONSTRAINT users_PK PRIMARY KEY,
password nvarchar(128),
roles nvarchar(64)
)

CREATE INDEX credentials ON users
(
username,
password
)

我們再在users表中添加兩個使用者:pwqzc  123456  Administrator,User
                              pwq    123456  User
第一個為名字,第二個為密碼,第三個為使用者所具有的角色,多個角色用,逗號分開

2,建立一個登陸頁login.aspx
裡面放兩個TextBox和一個按鈕,在按鈕的單擊事件裡寫代碼:
private void btnLogin_Click(object sender, System.EventArgs e)
{
//初始化FormsAuthentication
FormsAuthentication.Initialize();
//建立個connection和command對象
            SqlConnection conn = new SqlConnection("server=(local);uid=sa;pwd=mydream54win;database=web");
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "select roles from users where username=@username and password=@password";
//添加參數以及給參數賦值
cmd.Parameters.Add("@username",SqlDbType.VarChar,64);
cmd.Parameters["@username"].Value = Username.Value;
cmd.Parameters.Add("@password",SqlDbType.VarChar,128);
cmd.Parameters["@password"].Value = Password.Value;
            //開啟資料庫連接
conn.Open();
//執行命令
SqlDataReader reader = cmd.ExecuteReader();
if(reader.Read())
{
//建立一個新的驗證票FormsAuthenticationTicket
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1,//票版本號碼
Username.Value,//cookie名字
DateTime.Now,//產生cookie時間
DateTime.Now.AddMinutes(30),//cookie的有效時間
false,//是不是永久存在的cookie
reader.GetString(0));//從資料庫讀到的使用者角色資料
//把驗證票加密
string hashTicket = FormsAuthentication.Encrypt(ticket);
//設定驗證票cookie,第一個參數為cookie的名字,第二個參數為cookie的值也就是加密後的票
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,hashTicket);
//設定cookie的有效期間是一個禮拜
cookie.Expires = DateTime.Now.AddDays(7);
//把cookie加進Response對象發生到用戶端
Response.Cookies.Add(cookie);
//得到請求的url
string requestUrl = FormsAuthentication.GetRedirectUrl(FormsAuthentication.FormsCookieName,false);
//不要使用FormsAuthentication.RedirectFromLoginPage方法,因為這個方法會重寫cookie
//重新定向到請求的url
Response.Redirect(requestUrl);
}
else
{
    //如果不存在此使用者,則提示一些錯誤
ErrorLabel.Text = "使用者名稱或者密碼錯誤,請重試!";
ErrorLabel.Visible = true;
}
//關閉資料庫連接和reader
reader.Close();
conn.Close();
}


3,第三步,在應用程式的Global.asax中,找到Application_AuthenticateRequest,寫下面代碼,記的要匯入using System.Security.Principal;
using System.Web.Security;這兩個名字空間,代碼如下:
protected void Application_AuthenticateRequest(Object sender,EventArgs e)
{
if(HttpContext.Current.User!=null)//如果當前的http資訊中存在使用者資訊
{
if(HttpContext.Current.User.Identity.IsAuthenticated)//如果目前使用者的身份已經通過了驗證
{
if(HttpContext.Current.User.Identity is FormsIdentity)
{
    //如果目前使用者身份是FormsIdentity類即表單驗證類,此類有個屬效能夠訪問目前使用者的驗證票
FormsIdentity fi = (FormsIdentity)HttpContext.Current.User.Identity;//建立個FormsIdentity類,用他來訪問目前使用者的驗證票
                        //獲得使用者的驗證票
FormsAuthenticationTicket ticket = fi.Ticket;
//從驗證票中獲得使用者資料也就是角色資料
string userData = ticket.UserData;
//把使用者資料用,分解成角色數組
string[] roles = userData.Split(',');
//重寫目前使用者資訊,就是把角色資訊也加入到使用者資訊中
HttpContext.Current.User = new GenericPrincipal(fi,roles);
}
}
}
}

4,第四步,修改web.config
<configuration>
<system.web>
<authentication mode="Forms">
<forms name="MYWEBAPP.ASPXAUTH"
loginUrl="login.aspx"
protection="All"
path="/"/>
</authentication>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
<location path="admins">
<system.web>
<authorization>
<!-- Order and case are important below -->
<allow roles="Administrator"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
<location path="users">
<system.web>
<authorization>
<!-- Order and case are important below -->
<allow roles="User"/>
<deny users="*"/>
</authorization>
</system.web>
</location>
</co



相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

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

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