2006-09-21

ASP.NET 1.1 基于Forms的身份验证

ASP.NET 1.1 中已包含 Windows, Forms, Passport 三种身份验证功能,其中 Windows 是基于 Windows 操作系统的用户验证,Passport 是基于 Microsoft Passport 的用户验证,这两种的适用范围都太窄,而 Forms 验证则可以手动控制用户登录过程,比较适合使用。
构建基于 Forms 的身份验证过程如下:
1. 设置 IIS 为可匿名访问,在 asp.net 配置文件 web.config 中设置验证模式为 Forms 验证,并设置登录页面。
<configuration>
  <system.web>
    <authentication mode="Forms">
      <forms name="name" loginUrl="/login.aspx" protection="None" timeout="30" path="/" requireSSL="false" slidingExpiration="false" />
    </authentication>
  </system.web>
</configuration>
2. 处理用户登录逻辑,查询出用户所属于的角色。
3. 构造 FormsAuthenticationTicket 对象,将其加密后保存到 cookie 中。
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
     1,
     userName,
     DateTime.Now,
     DateTime.Now.AddMinutes(30),
     isPersistent,
     "roleA,roleB,roleC",  //角色列表,用逗号区分,可以自定义
     FormsAuthentication.FormsCookiePath);

string encTicket = FormsAuthentication.Encrypt(ticket);
Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
4. 在 AuthenticateRequest 事件中( Global.asax 中包含一个对应的默认函数 Application_AuthenticateRequest ),恢复出 FormsAuthenticationTicket 对象,创建对应的 IPrincipal 对象并保存在 HttpContext.User 中。
HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie!=null)
{
    FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value);
    string[] roles = authTicket.UserData.Split(new char[]{','});
    Context.User = new GenericPrincipal(Context.User.Identity, roles);
}
5. 对指定页面设定角色控制。
1. 在子目录中添加 web.config 配置文件,修改对整个子目录的访问权限。
<configuration>
  <system.web>
    <authorization>
      <allow roles="RoleName" />
      <deny users="*" />
    </authorization>
  </system.web>
</configuration>
2. 修改当前目录的 web.config 配置文件,为单独的页面修改访问权限。
<configuration>
  <system.web>
    <location path="EditPost.aspx">
      <system.web>
        <authorization>
          <allow roles="RoleName" />
          <deny users="*" />
        </authorization>
      </system.web>
    </location>
  </system.web>
</configuration>
3. 直接在页面中判断用户对应的角色。
if (User.IsInRole("RoleA"))
{
    //用户属于角色 RoleA ,处理...
}
4. 以上步骤均可以达到需要的效果,优先级为1>2>3。

0 Comments: