新项目使用.net core来开发,项目建为 web 应用程序类型,使用这个类型是基于其跟老的asp.net 使用webform开发方式类似,一个页面一个后置类(PageModel),如下图所示:
使用web应用程序项目类型开发速度和asp.net 使用aspx可视化界面有的一比,适用于短平快的项目,当然项目规划得好,我相信,大型项目一样没有问题照样撸下来;还有一个好处是直接在当前页面处理ajax请求也是非常方便的,不需要单独建立什么控制器再写一个方法(action)来处理事件,您可以在后置代码里面直接可以撸ajax处理事件,.net core出来这么久,已经更新到 2.2了,眼看3.0也会很快发布了,它的好处,只有亲身项目经历过才会深刻理解。
.net core使用razor pages没有登录,不能访问后台界面
今天我们的主旨是要实现在项目里面,有两个目录,需要登录后才能访问;如果访问者没有登录,直接在浏览器输入后台应用地址,则自动重定向到登录界面,如下图跳转链接所示,因此我建立了一个测试项目,并基于此实现了一个简单的使用cookie认证的demo项目,并且通过代码配置指定文件夹的方式来阻止非法访问请求。
follow me,还原需求
操作如下,打开VS2017,新建asp.net core web应用程序,选择Web 应用程序,使用asp.net core2.2,开发时去掉https配置,如下图所示:
新建好项目后,初始目录如下图所示:
项目创建成功后,按我下图所示添加两个目录,分别表示公司用户和个人用户的后台,这两个目录里面的页面,是必须登录后才能访问的;创建好后的目录结构如下图所示:
以上目录创建好了后,编译后运行,我们直接输入公司或者个人后台地址,效果如下图:
出现上面这种情况是肯定是不对的。
解决这个问题(Cookie身份认证)
真实项目中,出现直接输入地址可以访问后台的情况,那就很危险了,轻则脱库,重则破产,总之危险可大可小了。
使用.net core开发网站应用,因为是网站,我们直接使用基于cookie的身份认证方式吧,.net core为我们提供了优雅的方式来解决这个问题。要解决这个问题,需要做如下操作:
第一:配置指定目录须经认证才可访问,直接在启动类(Startup.cs)里面写如下代码即可。
services.AddMvc().AddRazorPagesOptions(options => { options.Conventions.AuthorizeFolder("/company"); options.Conventions.AuthorizeFolder("/personal"); });
以上代码是按文件夹来控制的,重要的一句是:options.Conventions.AuthorizeFolder(“/company”),它就是控制company目录按文件夹授权的,熟悉webform开发方式的朋友,可以跟form认证比较一下,在此就不详述。
第二:编写cookie配置身份认证代码即可,如下所示:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options => { options.Cookie.HttpOnly = true; options.LoginPath = new PathString("/login"); });
上面的代码,主要目的就是设置身份认证方式为cookie,并且设置经过认证后发送到客户端的cookie为只读,即只允许js脚本只读,同时还设置了没有登录直接输入后台地址时,自动跳转到登录(loging)界面。
第三:在Configure方法加上app.UseAuthentication();
这句代码不加是不起作用的。必须加。
如何登录和注销
在登录前面界面没有什么特别之处,主要是后台对事件的处理代码如下所示:
public async Task<IActionResult> OnPostLoginAsync() { //实际业务中,model需要验证,需要连接数据库根据登录方式从数据库查询用户 //通过注入方式,将服务层注入到此,调用登录方法, //通过构造函数注入。 var claims = new List<Claim> { new Claim(ClaimTypes.Name, "https://jhrs.com") }; var claimsIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimsIdentity)); //登录成功,跳转后台首页 return LocalRedirect("/company"); }
核心就是调用HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme,newClaimsPrincipal(claimsIdentity))这句代码完成cookie认证。
注销代码如下:
HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
完整的demo代码可以从这儿下载, .net core基于Cookie身份认证示例代码 (下载1664 )。
【江湖人士】(jhrs.com)原创文章,作者:江小编,如若转载,请注明出处:https://jhrs.com/2019/27113.html
扫码加入电报群,让你获得国外网赚一手信息。