没有创建Web应用程序,那就现在创建一个。当然你也可以在一个已有的Web应用程序中创建这个页面。这里我假设已经创建了一个名称为 RolebasedAuth的Web应用程序(即 Visual Studio .Net 中的Project)。我把这个Login.aspx放在它的根目录下,也就是通过 http://localhost/RolebasedAuth/Login.aspx 可以访问。
这个Login.aspx放在哪里是无所谓的,但是它必须是公众有权限访问的。
在应用程序根路径下,我们创建两个机密的子目录,分别是 Admin 和 User。
接下来,我们创建一个支持角色认证的窗体认证登录系统。因为微软没有提供简单的实现机制,我们要自己花些时间去创建认证票据。它需要存贮少量信息,当然,有些名称必须和 Web.config 中配置的一样,要不ASP.NET 就会认为你的认证票据是无效的,从而强制转向到登录页面。我们在 VS.NET 中为 Login.aspx 添加两个TextBox控件,取名 UserNameTextBox, PasswordTextBox,再添加一个Button,取名 LoginButton,点击它进入后台代码。在 LoginButton_Click 方法中添加需要的代码。如下:
程序代码
private void LoginButton_Click(object sender, System.EventArgs e)
{
// 初始化 FormsAuthentication
// 注意它是在 System.Web.Security 命名空间
// 因此要在代码开始添加 using System.Web.Security;
FormsAuthentication.Initialize ();
// 创建数据库连接和数据库操作命令对象
// 注意它是在 System.Data.SqlClient 命名空间
// 因此要在代码开始处添加 using System.Data.SqlClient;
SqlConnection conn =
new SqlConnection("Data Source=sun-willmove;integrated security=SSPI;Initial Catalog=WebSolution;");
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "Select UserRoles FROM Users Where UserName=@username " +
"AND Password=@password";
// 填充各个参数
cmd.Parameters.Add("@username", SqlDbType.NVarChar, 100).Value =
UserNameTextBox.Text;
cmd.Parameters.Add("@password", SqlDbType.NVarChar, 150).Value =
FormsAuthentication.HashPasswordForStoringInConfigFile(
PasswordTextBox.Text, "md5"); // 或者 "sha1"
// 执行数据库操作命令
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
// 为了实现认证,创建一个新的票据
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, // 票据版本号
UserNameTextBox.Text, // 票据持有者
DateTime.Now, //分配票据的时间
DateTime.Now.AddMinutes(30), // 失效时间
true, // 需要用户的 cookie
reader.GetString(0), // 用户数据,这里其实就是用户的角色
FormsAuthentication.FormsCookiePath);//cookie有效路径
//使用机器码machine key加密cookie,为了安全传送
string hash = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(
|