前端代码:
@{ MyFormsPrincipal<UserInfo> user = Context.User as MyFormsPrincipal<UserInfo>; if (user == null) { <form action="/home/login3"> <input type="text" name="userName" /> <input type="submit" value="登录" /> </form> } else { <form action="/home/logout2"> <div>当前用户已登录,登录名:@Context.User.Identity.Name</div> <div>当前用户已登录,登录时间:@user.UserData.LoginTime</div> <input type="submit" value="退出" /> </form> } }其实整个过程和FormsAuthentication.SetAuthCookie(userName, true); //登录是等效的。只是我们通过扩展,存了我们想要存储的数据。
过程也比较简单:
这里稍微复杂点的地方就是解密然后给User赋值HttpContext.Current.User = new MyFormsPrincipal<UserInfo>(ticket, userData);。
MyFormsPrincipal需要实现接口MyFormsPrincipal
倒也没有什么特别,就是实例化的时候传入票据和自定义数据就好了。
授权有了登录一般都离不开授权。微软的东西好就好在,一般都是成套成套的。
[Authorize] public ActionResult LoginOk() { return View(); }直接给Action添加一个Authorize特性就好了,这人就会自动检查是否登录。如果没有登录自动跳转到登录页面。登录页面的设置还是在web.config里面
<system.web> <authentication mode="Forms" > <forms loginUrl="/home/index"></forms>这种简单的授权验证明显是不够的。很多时候某些页面只有某些人才能访问。比如VIP。那么我们又要扩展了。
//继承 AuthorizeAttribute public class MyAuthorizeAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { if (filterContext.HttpContext.User.Identity.Name != "农码一生") { filterContext.HttpContext.Response.Write("您不是vip用户,不能访问机密数据"); filterContext.HttpContext.Response.End(); return; } base.OnAuthorization(filterContext); } } [MyAuthorize] public ActionResult LoginVIP() { return View(); }是的,就是这么简单。说了这么多,来张效果图吧:
推荐阅读:
Demo:
posted @