当前位置: 首页 > news >正文

政府网站集约化建设的好处/怎么做百度网页推广

政府网站集约化建设的好处,怎么做百度网页推广,小视频做网站怎么赚钱吗,it学校培训机构说明:本文示例使用的VS2017和MVC5。 系统无论大小、牛逼或屌丝,一般都离不开注册、登录。那么接下来我们就来分析下用户身份认证。 简单实现登录、注销 以前在学习.net的时候不知道什么Forms身份认证,直接用session实现登录,效果也…

说明:本文示例使用的VS2017和MVC5。
系统无论大小、牛逼或屌丝,一般都离不开注册、登录。那么接下来我们就来分析下用户身份认证。

简单实现登录、注销

以前在学习.net的时候不知道什么Forms身份认证,直接用session实现登录,效果也蛮好嘛。而且用户信息存在服务端,安全。
前端代码:

@if (string.IsNullOrWhiteSpace(ViewBag.UserName))
{<form action="/home/login1"><input type="text" name="userName" /><input type="submit" value="登录" /></form>
}
else
{<form action="/home/logout1"><div>当前用户已登录,登录名:@ViewBag.UserName</div><input type="submit" value="退出" /></form>
}

后台代码:

public ActionResult Index()
{ViewBag.UserName = Session["userName"]?.ToString();           return View();
}       public void Login1(string userName)
{if (!string.IsNullOrWhiteSpace(userName))  //为了方便演示,就不做真的验证了     Session["userName"] = userName;elseSession["userName"] = null;Response.Redirect(Request.UrlReferrer.LocalPath);//重定向到原来页面
}public void Logout1()
{Session["userName"] = null;Response.Redirect(Request.UrlReferrer.LocalPath);//重定向到原来页面
}

是不是,简单明了。想要自己扩展或是定制什么功能都非常好用。不过我们需要维护session。比如系统重新发布,或者iis被自动重启。就会出现session丢失的情况。也就是用户会莫名其妙提升需要重新登录。体验非常不好。(这里先不讨论session服务和数据库的情况)。既然微软有一套成熟的权限管理我们为什么不用呢?

Forms认证登录、注销

首先在web.config里开启Forms身份认证:

<system.web><authentication mode="Forms"></authentication>

后台代码:

public void Login2(string userName)
{if (!string.IsNullOrWhiteSpace(userName))  //为了方便演示,就不做真的验证了FormsAuthentication.SetAuthCookie(userName, true); //登录Response.Redirect(Request.UrlReferrer.LocalPath);//重定向到原来页面
}public void Logout2()
{FormsAuthentication.SignOut();//登出Response.Redirect(Request.UrlReferrer.LocalPath);//重定向到原来页面
}

前台代码:

@if (!Request.IsAuthenticated)
{<form action="/home/login2"><input type="text" name="userName" /><input type="submit" value="登录" /></form>
}
else
{<form action="/home/logout2"><div>当前用户已登录,登录名:@Context.User.Identity.Name</div><input type="submit" value="退出" /></form>
}

如此几句代码就实现了我们的登录和注销。和我们自己用session管理登录不同。Forms身份认证是直接把信息存cookie到浏览器的。通过SetAuthCookie这个方法名也可以看出来。不过Cookie信息经过了加密。
这里有必要说明session和cookie的关系。当我们利用session来维持用户状态的时候,其实也用到了cookie。
208266-20170729211023691-321798446.png
然而Forms身份认证仅仅只是把信息存了cookie,而没有在服务端维护一个对应的session。
不信你可以测试。可以用两种方式都登录,然后清除session就可以测出来了。(怎么清session?重启iis,或者修改下后台代码在重新编译访问)
【说明】用户认证为什么要存cookie?因为HTTP是一个无状态的协议。对于服务器来说,每次请求都是一样的。所以,只能通过每次请求带的cookie来识别用户了。(暂时不考虑其他方式)

自定义的身份认证标识

上面使用的登录很简单,但实际情况往往很复杂。明显正常业务需要存的用户信息会要更多。那么我们是否可以扩展身份标识呢?答案是肯定的。
后台代码:

public void Login3(string userName)
{if (!string.IsNullOrWhiteSpace(userName))  //为了方便演示,就不做真的验证了     {UserInfo user = new UserInfo(){Name = userName,LoginTime = DateTime.Now};//1、序列化要保存的用户信息var data = JsonConvert.SerializeObject(user);//2、创建一个FormsAuthenticationTicket,它包含登录名以及额外的用户数据。FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, userName, DateTime.Now, DateTime.Now.AddDays(1), true, data);//3、加密保存string cookieValue = FormsAuthentication.Encrypt(ticket);// 4. 根据加密结果创建登录CookieHttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue);cookie.HttpOnly = true;cookie.Secure = FormsAuthentication.RequireSSL;cookie.Domain = FormsAuthentication.CookieDomain;cookie.Path = FormsAuthentication.FormsCookiePath;// 5. 写登录CookieResponse.Cookies.Remove(cookie.Name);Response.Cookies.Add(cookie);}Response.Redirect(Request.UrlReferrer.LocalPath);//重定向到原来页面
}

然后在Global.asax的Application_AuthenticateRequest方法:

protected void Application_AuthenticateRequest()
{GetUserInfo();
}//通过coolie解密 读取用户信息到 HttpContext.Current.User
public void GetUserInfo()
{// 1. 读登录CookieHttpCookie cookie = Request.Cookies[FormsAuthentication.FormsCookieName];try{UserInfo userData = null;// 2. 解密Cookie值,获取FormsAuthenticationTicket对象FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value);if (ticket != null && string.IsNullOrEmpty(ticket.UserData) == false)// 3. 还原用户数据userData = JsonConvert.DeserializeObject<UserInfo>(ticket.UserData);if (ticket != null && userData != null)// 4. 构造我们的MyFormsPrincipal实例,重新给context.User赋值。HttpContext.Current.User = new MyFormsPrincipal<UserInfo>(ticket, userData);}catch { /* 有异常也不要抛出,防止攻击者试探。 */ }
}

前端代码:

@{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); //登录是等效的。只是我们通过扩展,存了我们想要存储的数据。
过程也比较简单:

  • 构造要存储的数据
  • 序列化
  • 把序列化信息放入FormsAuthenticationTicket对象
  • 通过FormsAuthentication.Encrypt加密对象
  • 发送cookie到浏览器

这里稍微复杂点的地方就是解密然后给User赋值HttpContext.Current.User = new MyFormsPrincipal<UserInfo>(ticket, userData);
MyFormsPrincipal需要实现接口MyFormsPrincipal

public class MyFormsPrincipal<TUserData> : IPrincipal where TUserData : class, new()
{private IIdentity _identity;private TUserData _userData;public MyFormsPrincipal(FormsAuthenticationTicket ticket, TUserData userData){if (ticket == null)throw new ArgumentNullException("ticket");if (userData == null)throw new ArgumentNullException("userData");_identity = new FormsIdentity(ticket);_userData = userData;}public TUserData UserData{get { return _userData; }}public IIdentity Identity{get { return _identity; }}public bool IsInRole(string role)//这里暂时不实现{return false;}
}

倒也没有什么特别,就是实例化的时候传入票据和自定义数据就好了。

授权

有了登录一般都离不开授权。微软的东西好就好在,一般都是成套成套的。

[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();
}

是的,就是这么简单。说了这么多,来张效果图吧:
208266-20170729214912113-97849090.gif

 

推荐阅读:

  • http://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.html
    Demo:
  • https://github.com/zhaopeiym/BlogDemoCode/tree/master/权限管理/1-Forms身份认证
http://www.lbrq.cn/news/739261.html

相关文章:

  • 建个站的免费网站能上百度吗/销售的三个核心点
  • 漳州市政府门户网站建设/百度下载并安装到桌面
  • web版wordpress/seo公司排行
  • 免费空间申请2018/官网seo优化
  • wordpress源码系统下载地址/南京百度网站快速优化
  • 新手卖家做来赞达网站如何/引流推广平台
  • flash做的小动画视频网站/怎么做手工
  • php不用框架怎么做网站/制作网站要多少费用
  • 东莞网站建设有什么网络公司/厦门百度推广排名优化
  • 公司网站制作内容/制作一个网站的费用是多少
  • 深圳国税局网站怎么做票种核定/大庆建站公司
  • 企业官网门户网站管理系统/保定百度seo公司
  • 设计类专业介绍/seo推广优化培训
  • 蒙阴建设局网站/网络推广引流有哪些渠道
  • 上海门户网站制/合肥seo整站优化
  • 不懂英文怎么做英文的seo网站/鄞州seo服务
  • 电脑网页打不开怎么解决/关键词快速优化排名软件
  • dw做旅游网站毕业设计模板下载/网站快速建站
  • 怎么看网站开发语言/免费python在线网站
  • 加强县政府网站建设的几点建议/软件排名优化
  • 淘宝店招免费做的网站有/网站做优化好还是推广好
  • 网页的响应式布局/免费关键词优化工具
  • 网站宽屏背景/seo网络营销外包
  • 制作图片的软件叫什么/徐州seo招聘
  • 广州外贸网站设计/传媒网站
  • 央企 网站建设 公司/推广网络营销外包公司
  • 有什么做服装的网站/暴风seo论坛
  • wordpress windows伪静态/杭州seo靠谱
  • 外国优秀网站设计/二次感染即将大爆发
  • 欧美做爰视频网站/海南百度推广总代理
  • “无纸化办公”加速推进,房产证智能识别技术或成行业标配
  • 23种设计模式——适配器模式(Adapter)​详解
  • 企业微信2025年发布会新功能解读:企业微信AI——2025年企业协作的「最优解」是如何炼成的?
  • HTTP/1.1 与 HTTP/2 全面对比:性能革命的深度解析
  • 大语言模型中的归一化实现解析
  • 王树森深度强化学习DRL(三)围棋AlphaGo+蒙特卡洛