View Post
用户身份验证以及角色授权
1.用户的身份验证
用户的三种验证方式:Windows、Forms、Passport
Windows是默认的身份验证方式,它是根据机器的访问权限来判断的
Passport是微软提供的验证方式
Forms就是表单验证,提供了以身份ID和密码的形式进行验证和授权管理功能
2.认证用户的原理
用户登录的时候给用户一个表明身份的票据,以后用户登录的时候通过这个票据就能知道这个用户已经被注册
3.Forms验证设置的流程
a.配置web.config启用Froms验证
<authentication mode="Forms">
<forms defaultUrl="Default.aspx" loginUrl="Login.aspx"></forms>
</authentication>
b.配置授权设置
<authorization>
<allow users="*"/> //允许所有用户,我们也可以设置特定的ID用户访问
<deny users="?"/> //拒绝匿名用户
</authorization>
注意:
先写allow,在写deny,否则会出现问题
c.登陆页面中生成用户票据便于其他页面访问
FormsAuthentication.SetAuthCookie(userid, true); //为用户创建一个票证,并将其放入cookie或者url中
4.文件夹内授权设置
a.在文件夹内添加一个web.config配置文件
b.在里面配置授权设置
5.用户角色授权
a.生成票据:
string userId="admin";
string pass="123";
string roles="Adminstrator"; //从其他地方取得用户角色数据
FormAuthenticationTicket Ticket=new FormAuthentication(1,userId,DateTime.Now,DataTime.Now.AddMinutes(30),true,roles); //建立身份验证票对象
string HashTicket=FormsAuthentication.Encrypt(Ticket); //加密序列化验证为字符串
HttpCookie UserCookie=new HttpCookie(FormAuthentication.FormsCookieName,HashTicket); //生成Cookie
Context.Response.Cookies.Add(UserCookie); //票据写入Cookie
Response.Redirect("Info.aspx");
b. 给用户票据的时候在里面加了一个字符串的角色信息,比如“Administrator”,当一个请求过来的时候asp.net会有一个Application_AuthenticateRequest的事件,专门用于用户认证授权,在 这个事件中我们只需要将这个字符表达的角色重建给用户就可以,我们在Global.asax的Application_AuthenticateRequest方法中增加如下代码:
protected void Application_AuthenticateRequest(object sender,EventArgs e)
{
HttpApplication app=(HttpApplication)sender;
HttpContext context=app.Context; //获取本次Http请求的HttpContext对象
if(context.Request.IsAuthenticated) //验证过的一般用户才能进行角色验证
{
FormsIdentity Id=(FormsIdentity)context.User.Identity; //当前用户标识
FormsAuthenticationTicket Ticket=Id.Ticket; //取得身份证票
string[] Roles=Ticket.UserData.Split(\',\'); //将角色数据专程字符串数组,得到相关的角色信息
context.User=new System.Security.Principal.GenericPrincipal(Id,Roles); //重新生成带有角色信息的用户
}
}
}
c.更改配置文件,设置info.aspx页面只有Adminstrator的角色才可以访问,代码如下:
<location path="Info.aspx">
<system.web>
<authorization>
<allow roles="Adminstrator"/>
<deny users="*"/>
</authorization>
</system.web>
</location>