在asp.net中自带了forms验证的实现,没有通过表单的验证将被导航到登录页面,要在web.config文件中作设置,具体如下:
上述配置了验证的方式为Forms,而验证的表单页面为Login.aspx,过期时间60分钟。设置了登录表单那如何控制没有登录的用户不能访问其他页面呢? 这需要在相应的文件夹下添加web.config配置文件,对用户进行授权,如下:
此配置说明用户名为administrator的用户可以访问页面,角色为vip的可以访问,其他的匿名用户不可以访问(?表示匿名用户,*表示全部用户)。
现在有个问题,如何来保存这些用户信息呢?下面介绍三种情况:
1. 可以在<forms>中配置用户信息,如下:
添加一个用户为administrator,密码为123,可以添加多个用户,可以选择密码方式passwordFormat(取值有:Clear不加密 ,MD5加密,SHA1加密),在此情况下如何在登录界面验证是否登录成功呢?可以用如下代码:
在重定向到原始请求页面还可以用FormsAuthentication.RedirectFromLoginPage()方法。
如果要退出登录需要调用:FormsAuthentication.SignOut()
2.在forms中存放的用户不可以设置角色,那如何进行角色的控制,微软提供了完整用户设置、授权功能。
首先要在数据库中建立相关的权限控制表,可以在SDK命令提示行中输入aspnet_regsql启动创建表结构的向导,根据向导一步步创建即可。
接下来可以修改配置参数使用户权限控制的数据库连接指向到该数据库,可以在MMC控制台中ASP.NET中配置,配置的结果如下(可以从machine.config参考):
注意:需要将上述代码中
minRequiredNonalphanumericCharacters
=
"1"改为="0", 不然在配置工具中添加用户存在需要包含1的提示,无法保存。
经过这样的配置之后可以在vs环境中打开asp.net配置,在安全中设置角色,用户,配置授权操作。
接下来的问题就是在登录窗口中如何判断有没有登录成功, 可以用如下语句:
另外这种微软提供的用户权限控制还可以使用控件完成登录、注册等功能。
3. 在我们做一些管理系统中可以自己设计权限控制系统,一般也是基于角色的控制,不同的角色可以操作不同的菜单,不同菜单下的功能,对于这种控制网上很多。这种设计如何控制用户必须登录才能使用系统功能呢?
用户密码验证需要编写业务层的方法,提取数据库信息加以验证,验证成功后如何表示验证成功了呢?我们同样可以采用上述的方法cookie中添加用户票据,下面举例对票据加密的代码:
另外一种可能完全抛弃微软提供的身份验证方式,将用户登录的用户信息保存到Session中,在每个页面中加以判断。为避免每个页面都作判断,可以在Global.asax中添加如下代码:
最后,自己设计的权限系统如何能使用微软的角色和访问控制呢?有待解决
- <system.web>
- <authentication mode="Forms">
- <forms name="Login" loginUrl="~/Login.aspx" timeout="60">
- </forms>
- </authentication>
- </system.web>
- <system.web>
- <authorization>
- <allow users="administrator"/>
- <allow roles="vip"/>
- <deny users="?"/>
- </authorization>
- <system.web>
现在有个问题,如何来保存这些用户信息呢?下面介绍三种情况:
1. 可以在<forms>中配置用户信息,如下:
- <forms name="Login" loginUrl="~/Login.aspx" timeout="60">
- <credentials passwordFormat="SHA1">
- <user name="administrator" password="123"/>
- </credentials>
- </forms>
- if (FormsAuthentication.Authenticate(txtName.Text,txtPsd.Text))
- { System.Web.Security.FormsAuthentication.SetAuthCookie(txtName.Text, true); // 发送验证成功票据
- string strRedirect;
- //表单验证所指定的路径
- strRedirect = Request["ReturnUrl"];
- if(strRedirect==null)
- {
- Response.Redirect("Default.aspx");
- }
- else
- {
- Response.Redirect(strRedirect);
- }
- }
如果要退出登录需要调用:FormsAuthentication.SignOut()
2.在forms中存放的用户不可以设置角色,那如何进行角色的控制,微软提供了完整用户设置、授权功能。
首先要在数据库中建立相关的权限控制表,可以在SDK命令提示行中输入aspnet_regsql启动创建表结构的向导,根据向导一步步创建即可。
接下来可以修改配置参数使用户权限控制的数据库连接指向到该数据库,可以在MMC控制台中ASP.NET中配置,配置的结果如下(可以从machine.config参考):
- <connectionStrings>
- <add name="LocalSqlServer" connectionString="data source=./SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/>
- <membership>
- <providers>
- <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/>
- </providers>
- </membership>
- <profile>
- <providers>
- <add name="AspNetSqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
- </providers>
- </profile>
- <roleManager>
- <providers>
- <add name="AspNetSqlRoleProvider" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
- <add name="AspNetWindowsTokenRoleProvider" applicationName="/" type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
- </providers>
- </roleManager>
经过这样的配置之后可以在vs环境中打开asp.net配置,在安全中设置角色,用户,配置授权操作。
接下来的问题就是在登录窗口中如何判断有没有登录成功, 可以用如下语句:
- Membership.ValidateUser(this.txtLoginId.Text, this.txtLoginPwd.Text)
3. 在我们做一些管理系统中可以自己设计权限控制系统,一般也是基于角色的控制,不同的角色可以操作不同的菜单,不同菜单下的功能,对于这种控制网上很多。这种设计如何控制用户必须登录才能使用系统功能呢?
用户密码验证需要编写业务层的方法,提取数据库信息加以验证,验证成功后如何表示验证成功了呢?我们同样可以采用上述的方法cookie中添加用户票据,下面举例对票据加密的代码:
- FormsAuthenticationTicket tkt;
- string cookiestr;
- HttpCookie ck;
- tkt = new FormsAuthenticationTicket(1, user.Name, DateTime.Now, DateTime.Now.AddMinutes(30), true, "your custom data"); //创建一个验证票据
- cookiestr=FormsAuthentication.Encrypt(tkt);//并且加密票据
- ck=new HttpCookie(FormsAuthentication.FormsCookieName,cookiestr);// 创建cookie
- ck.Path=FormsAuthentication.FormsCookiePath;//cookie存放路径
- Response.Cookies.Add(ck);
- void Session_Start(object sender, EventArgs e)
- {
- if (Session["SysUser"] == null)
- {
- Response.Redirect("~/Login.aspx");
- }
- }