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>
<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));
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);
}
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>
<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>
<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 ,处理...
}
{
//用户属于角色 RoleA ,处理...
}
4. 以上步骤均可以达到需要的效果,优先级为1>2>3。
0 Comments:
Post a Comment