您的位置:首页 > 编程语言 > ASP

初识ASP.NET MVC窗体验证与权限过滤---1.窗体身份验证

2015-05-16 10:40 447 查看
         一直不懂如何解决web系统的登录权限控制问题,在最开始的时候,我用了一个很土的方法。用户登录成功后就把用户的身份信息写到一个会话cookie中。这种方法非常的脆弱而且不安全。比如a用户登录后没有退出功能页面,此时他又登录了b用户的账户,身份cookie已经被改写成了b。如果此时他回到a用户的功能页上继续操作,轻则他会看到b用户的相关信息,重则会出现系统错误。

         就算用户正常登录了,如何保证系统对用于做出恰当的权限识别,防止他进入非授权的页面。使用这种简单的土办法同样解决不了。

         虽然知道mvc中已经集成了窗体身份验证,并且可以通过过滤器来进行访问控制,但一直没有时间研究(全是借口^_^)。昨天搞到半夜,总算是有点眉目了,特记录备忘。

          mvc的窗体身份验证和我的土办法其实原理是一样的。要想服务端知道客户端是谁,肯定要为客户端打上某种“标记”,mvc使用了一个称为 FormsAuthenticationTicket的东东,待登陆后,你创建一个鉴权票据加密后存储到客户端。服务器来根据这个加密cookies判断你的身份,很简单吧。页面代码如下,为了方便演示,没有采集任何输入,直接向服务端发送了异步请求,并指定自己的角色。

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<script  src="~/Scripts/jquery-1.8.2.min.js">    </script>
<script>
$(function () {
$('#btn_login_index').click(function () {
$.ajax({
url: '/Home/LogOn',
cache: false,
data: { UserName: "Andy", Role: "Manager" },
success: function () {
location.replace('/Main/index');
}
});
});
});
</script>
<title>Login</title>
</head>
<body>
<div>
<button id="btn_login_index">登录</button>
</div>
</body>
</html>
       获得授权后跳转到另一个页面。服务器端代码如下:
public string LogOn(string username, string role)
{
//在实际代码中,以下应该为根据用户名和密码从业务层进行验证并获取权限
//用户名和密码可以采用Base64加密
UserModel user = new UserModel { ID = 2, Name = "Andy", Password = "123456", Roles = new string[] { role } };
//将用户身份存入Session,过期时间为30分钟
Session["username"] = username;
Session["userid"] = user.ID;
Session["roles"] = user.Roles.Aggregate((x, y) => x + "," + y);
//创建窗体验证票据
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1,
user.Name,
DateTime.Now,
DateTime.Now.Add(FormsAuthentication.Timeout),
false,
user.Roles.Aggregate((i, j) => i + "," + j)
);
//加密后写入cookies
HttpCookie cookie = new HttpCookie(
FormsAuthentication.FormsCookieName,
FormsAuthentication.Encrypt(ticket));
//将cookies添加到响应
Response.Cookies.Add(cookie);
return "yes";
}
             登陆后,服务器向浏览器发送了两个cookies,.ASPXAUTH就是窗体验证的鉴权cookies,由于我们使用了session,所以服务端又发送了一个sessionid来标示session。若不使用session,则不会发送第二个cookies。



           至此,我们就完成了窗体身份验证,是不是很简单。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mvc c#