asp.net core后台系统登录的快速构建

登录流程图

示例预览

构建步骤

当然,你也可以直接之前前往coding仓库查看源码,要是发现bug记得提醒我啊~ LoginDemo地址

1. 首先你得有一个项目

2. 然后你需要一个登录页面

完整Login.cshtml视图代码戳这里-共计55行
效果预览图

<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>登录界面</title><meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no"><link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"><style type="text/css">body { color: #fff; font-family: "微软雅黑"; font-size: 14px; background: url('https://dn-coding-net-production-pp.qbox.me/96ec8cc7-0e5f-4217-b853-4a88c15579f3.png') no-repeat; }.wrap1 { position: absolute; top: 0; right: 0; bottom: 0; left: 0; margin: auto; height: 450px; }/*把整个屏幕真正撑开--而且能自己实现居中*/.main_content { background: url(https://dn-coding-net-production-pp.qbox.me/2ed70a05-04ad-4ccf-81d4-bc1fad2b6e41.png) repeat; margin-left: auto; margin-right: auto; text-align: left; float: none; border-radius: 8px; }.form-group { position: relative; }.login_btn { display: block; background: #3872f6; color: #fff; font-size: 15px; width: 100%; line-height: 50px; border-radius: 3px; border: none; }.login_input { width: 100%; border: 1px solid #3872f6; border-radius: 3px; line-height: 40px; padding: 2px 5px 2px 30px; background: none; }.icon_font { position: absolute; top: 12px; left: 10px; font-size: 18px; color: #3872f6; }.font16 { font-size: 16px; }.mg-t20 { margin-top: 20px; }@media (min-width:200px) {.pd-xs-20 { padding: 20px; }}@media (min-width:768px) {.pd-sm-50 { padding: 50px; }}#grad { background: -webkit-linear-gradient(#4990c1, #52a3d2, #6186a3); /* Safari 5.1 - 6.0 */ background: -o-linear-gradient(#4990c1, #52a3d2, #6186a3); /* Opera 11.1 - 12.0 */ background: -moz-linear-gradient(#4990c1, #52a3d2, #6186a3); /* Firefox 3.6 - 15 */ background: linear-gradient(#4990c1, #52a3d2, #6186a3); /* 标准的语法 */ }/*==jquery.validate css==*/.field-validation-error { color: #e14430 !important; padding-top: 5px; }.input-validation-error { border-color: #d38e99; }</style></head><body><div class="container wrap1"><h2 class="mg-b20 text-center">后台管理系统</h2><div class="col-sm-8 col-md-5 center-auto pd-sm-50 pd-xs-20 main_content"><p class="text-center font16">用户登录</p><form asp-action="Login" method="post" ><div class="form-group mg-t20"><i class="icon_font glyphicon glyphicon-user"></i><input type="text" class="login_input" asp-for="UserName" placeholder="请输入用户名" autofocus /><span asp-validation-for="UserName"></span></div><div class="form-group mg-t20"><i class="icon_font glyphicon glyphicon-lock"></i><input type="password" class="login_input" asp-for="UserPwd" placeholder="请输入密码" /><span asp-validation-for="UserPwd"></span></div><div class="checkbox mg-b25 hide"><label><input type="checkbox">记住我的登录信息                    </label></div><button type="submit" class="login_btn">登 录</button></form></div></div></body></html>

3. 然后你需要一个登录的控制器AccountController

控制器里面至少拥有一个呈现登录页的action,一个接收登录请求的action,一个退出的action
·登录· 判断是否存在用户,将用户名或者用户ID加密后记录到cookie中,跳转到管理页
·退出· 将cookie移出掉,跳转到登录页
加密的方法可自行切换为其他的加密方法

    public class AccountController : Controller{     
      private readonly IUserService _userService;  
         
    public AccountController(IUserService userService)        {_userService = userService;}      
    
      public IActionResult Login()        {      
          return View();}
          [HttpPost][ValidateAntiForgeryToken]  public IActionResult Login(AccountModel model)        {            //验证模型是否正确if (!ModelState.IsValid){
          return View(model);}          
          //调用服务验证用户名密码if (!_userService.Login(model.UserName, model.UserPwd)){ModelState.AddModelError(nameof(model.UserPwd), "用户名或密码错误");                return View();}          
          //加密用户名写入cookie中,AdminAuthorizeAttribute特性标记取出cookie并解码除用户名var encryptValue = _userService.LoginEncrypt(model.UserName, ApplicationKeys.User_Cookie_Encryption_Key);HttpContext.Response.Cookies.Append(ApplicationKeys.User_Cookie_Key, encryptValue);            return Redirect("/");}        
          public IActionResult Logout()        {HttpContext.Response.Cookies.Delete(ApplicationKeys.User_Cookie_Key);            return Redirect(WebContext.LoginUrl);}}

4. 然后还需要一个身份验证的特性标记AdminAuthorizeAttribute

本文只是简单的验证是否登录,关于更复杂的权限验证可参考文章:http://www.cnblogs.com/morang/p/7606843.html,以及示例项目
将此特性标记加到需要的地方即可在访问时验证用户是否登录,未登录则跳转到登录页。

    public class AdminAuthorizeAttribute : Attribute, IAuthorizationFilter{        public void OnAuthorization(AuthorizationFilterContext filterContext)        {            if (string.IsNullOrEmpty(WebContext.AdminName)){                if (filterContext.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest"){filterContext.Result = new JsonResult("未登录");}                else{filterContext.Result = new RedirectResult("Account/Login");}                return;}}}

上面特性标记代码中的WebContext.AdminName是如何取到的呢?还需要结合如下代码

    //服务定位器public static class ServiceLocator{       
    public static IServiceProvider Instance { get; set; }      
    
      public static T GetService<T>() where T : class{            return Instance.GetService<T>();}}  
       //一些通用的信息public static class WebContext{      
        public static string AdminName{        
           get{                //获取cookievar hasCookie = ServiceLocator.GetService<IHttpContextAccessor>().HttpContext.Request.Cookies.TryGetValue(ApplicationKeys.User_Cookie_Key, out string encryptValue);            
               if (!hasCookie || string.IsNullOrEmpty(encryptValue))                    return null;              
                 var adminName = ServiceLocator.GetService<IUserService>().LoginDecrypt(encryptValue, ApplicationKeys.User_Cookie_Encryption_Key);                return adminName;}}      
   
     public const string LoginUrl = "/account/login";}  
      //全局的一些Key值public class ApplicationKeys{      
       public const string User_Cookie_Encryption_Key = "User_Cookie_Encryption_Key";      
        public const string User_Cookie_Key = "User_Cookie_Key";}    
        //Startuppublic void ConfigureServices(IServiceCollection services)    {services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();//用于获取请求上下文services.AddTransient<IUserService, UserService>();services.AddMvc();}    public void Configure(IApplicationBuilder app, IHostingEnvironment env)    {        //app.UseMvc()..//最末的时候赋值ServiceLocator.Instance = app.ApplicationServices;}

代码说明

  1. 首先定义了一个存放服务的静态对象:ServiceLocator

  2. 在程序启动后将IApplicationBuilder.ApplicationServices赋值给ServiceLocator.Instance,这样就能够在任何地方使用ServiceLocator.Instance获取到注入的服务
    (为了更好的获取实例添加了一个T GetService<T>()方法)

  3. 在WebContext中取获取Cookie值:ServiceLocator.GetService<IHttpContextAccessor>().HttpContext.Request.Cookies

  4. 解密获取的cookie得到用户名:ServiceLocator.GetService<IUserService>().LoginDecrypt(encryptValue, ApplicationKeys.User_Cookie_Encryption_Key);

  5. 所以在后台就能使用WebContext.AdminName获取到当前登录用户名,或者根据用户名获取登录信息

总结

  • 自定义特性标记和过滤器之间差开一个IFilterMetadata,换言之:特性标记实现了IFilterMetadata就等于是个过滤器(个人理解)

  • asp.net core中模型绑定使用asp-for

  • asp.net core注入服务: 在 Startup.ConfigureServices方法中注入 services.AddTransient<IUserService, UserService>()

  • asp.net core获取HttpContext对象 参考:ASP.NET Core开发之HttpContext

    ASP.NET Core中提供了一个IHttpContextAccessor接口,HttpContextAccessor 默认实现了它简化了访问HttpContext
    它必须在程序启动时在IServicesCollection中注册,这样在程序中就能获取到HttpContextAccessor,并用来访问HttpContext
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

  • asp.net core中表单直接使用form标签,asp-action,asp-controller等指定路由参数即可,并且能够自动生成防伪字段标识,配合ValidateAntiForgeryToken特性标记预防CSRF 代码生成比较图
    相关文档地址:https://docs.microsoft.com/zh-cn/aspnet/core/security/anti-request-forgery

  • autofocus属性 可使文本框自动获取焦点

Demo下载地址

  • 点击下载Demo

  • Coding仓库地址克隆代码:git clone https://git.coding.net/yimocoding/WeDemo.git -b LoginDemo LoginDemo

探索学习中,若有错误或者不足指出还望园友指出。

原文地址:http://www.cnblogs.com/morang/p/7614537.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nssl1211-好文章【字符串hash,map】

正题 题目大意 求长度为n个一个字符串长度为m不同的子串个数 解题思路 用字符串hash判断字符串是否相同&#xff0c;然后时间复杂度O(n2)O(n^2)O(n2)&#xff0c;然后我们因为自然溢出所以不能开桶&#xff0c;那就开map。然后就会愉快的被卡&#xff0c;所以再加一个自定义模…

JavaFX Chart设置数值显示

一、XYChart import javafx.application.Application; import javafx.geometry.NodeOrientation; import javafx.geometry.Side; import javafx.scene.Scene; import javafx.scene.chart.*; import javafx.scene.control.Label; import javafx.stage.Stage;public class LineC…

多多自走棋

文章目录[x]形似麻将种族职业各种搭配操作下面还是讲讲攻略&#xff08;主要&#xff09;在朋友的推荐下玩了自走棋&#xff0c;我一个不玩王者不玩吃鸡的人&#xff0c;玩这游戏竟然上瘾了&#xff0c;太不可思议了&#xff0c;这两天被这游戏搞得中午都没睡好&#xff0c;不得…

Linux--用SecureCRT来上传和下载文件

转载自 Linux--用SecureCRT来上传和下载文件 SecureCRT下的文件传输协议有以下几种&#xff1a;ASCII、Xmodem、Ymodem、Zmodem ASCII&#xff1a;这是最快的传输协议&#xff0c;但只能传送文本文件。 Xmodem&#xff1a;这种古老的传输协议速度较慢&#xff0c;但由于使用…

从头编写 asp.net core 2.0 web api 基础框架 (1)

工具: 1.Visual Studio 2017 V15.3.5 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相关知识就不介绍了, 这里主要是从头编写一个asp.net core 2.0 web api的基础框架. 我最近几年一直在使用asp.net web api (传统.net framework)作为后台Api, …

nssl1209-奇怪的队列【贪心,权值线段树】

正题 题目大意 给出每个人前或后面比他高的人数&#xff0c;然后求一个序列&#xff0c;人们高度字典序最小的序列。 解题思路 我们将高度从小到大插入&#xff0c;然后对于每个人至少保留一些比他高的人的空位&#xff0c;然后用权值线段树O(log2n)O(log^2 n)O(log2n)计算第…

美妙的Github

这十天来&#xff0c;一度被自走棋带入了旋涡。没学到什么&#xff0c;但让我惊喜的是&#xff0c;游戏之余&#xff0c;我尝试了下Github。人们都讲Github是程序员的必备&#xff0c;连Github都不知道做什么程序员。玩了github之后我才是知道什么叫大佬。 通常我找源代码都是上…

layer之jquery 弹窗插件 (最后版本v1.8.5)

转载自 jquery 弹窗插件 layer jquery.layer版本&#xff08;v1.8.5&#xff09;下载地址 注意&#xff1a;v1.8.5后改版移除各种API&#xff0c;构造方法改版 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/ht…

白嫖之Github

文章目录[x]微信机器人这十天来&#xff0c;一度被自走棋带入了旋涡。没学到什么&#xff0c;但让我惊喜的是&#xff0c;游戏之余&#xff0c;我尝试了下Github。人们都讲Github是程序员的必备&#xff0c;连Github都不知道做什么程序员。玩了github之后我才是知道什么叫大佬。…

asp.net core封装layui组件示例分享

什么封装&#xff1f;这里只是用了TagHelper&#xff0c;是啥&#xff1f;自己瞅文档去 在学习使用TagHelper的时候&#xff0c;最希望的就是能有个Demo能够让自己作为参考 怎么去封装一个组件&#xff1f; 不同的情况怎么去实现&#xff1f; 有没有更好更高效的方法&#xff1…

ssl提高组周三备考赛【2018.10.17】

前言 爆零… 成绩 爆蛋的就不放了 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC1112017hjq2017hjq2017hjq2022022021414148888881001001002222017zyc2017zyc2017zyc1001001000001001001000003332015lzx2015lzx2015lzx1001001001001001000000004442017lrz2017lrz2…

layer之弹层组件文档 layui.layer(v.1.9.0之后)

弹层组件文档 - layui.layer layer 至今仍作为 layui 的代表作&#xff0c;她的受众广泛并非偶然&#xff0c;而是这数年来的坚持、不弃的执念&#xff0c;将那些不屑的眼光转化为应得的尊重&#xff0c;不断完善和维护、不断建设和提升社区服务&#xff0c;在 Web 开发者的圈子…

设置宽带自动连接

刚接触电脑的小伙伴有没有这样的困扰&#xff0c;每次电脑开机的时候都要自己手动重新连接宽带&#xff0c;很麻烦。 而通过一些设置我们可以免除这样的麻烦&#xff0c;不需要输入账号密码&#xff0c;开机自动连接&#xff0c;每次开机省去个一两分钟的宽带连接时间&#xf…

随时随地以任意方式编写 .NET 应用程序

希望大家现在都知道&#xff0c;Microsoft .NET 不再仅适用于 Windows。借助 .NET Core&#xff0c;可以使用想要的语言&#xff08;C#、Visual Basic 或 F#&#xff09;编写应用程序&#xff0c;这些应用程序可以在选定的任何 OS&#xff08;Windows、macOS 或 Linux&#xff…

ssl提高组周四备考赛【2018.10.18】

前言 开始做四面八方扣来的题 成绩 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC1112017zyc2017zyc2017zyc1601601607070703030306060602222017wyc2017wyc2017wyc1401401408080801010105050503332017lrz2017lrz2017lrz1401401404040401001001000004442017xjq2017x…

java实现如何定时给微信群中发送消息

大家好&#xff0c;我是雄雄。 前言 前几天&#xff0c;发了一个系列这样的文章&#xff0c;如下所示&#xff1a; java实现每日给女友微信发送早安等微信信息java实现给微信群中定时推送消息如何将每日新闻添加到自己博客中&#xff0c;发送到微信群中 基本都是说的一个事儿…

一张图理清ASP.NET Core启动流程

1. 引言 对于ASP.NET Core应用程序来说&#xff0c;我们要记住非常重要的一点是&#xff1a;其本质上是一个独立的控制台应用&#xff0c;它并不是必需在IIS内部托管且并不需要IIS来启动运行&#xff08;而这正是ASP.NET Core跨平台的基石&#xff09;。ASP.NET Core应用程序拥…

ssl提高组周六备考赛【2018.10.20】

前言 er…竟然卡读入输出还不给快读qwq 成绩 有些dalao被老师拉去USACO了&#xff0c;所以没有 HJW应该去jzoj做题了 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC1112017myself2017myself2017myself2402402407070701001001007070702222017zyc2017zyc2017zyc1901…

DevOps之发布系统V1.0

一、发布系统架构 &#xff08;1&#xff09;普通发布 &#xff08;2&#xff09;微服务发布 二、子系统与功能模块 &#xff08;1&#xff09;代码仓库 github、gitlab、svn &#xff08;2&#xff09;构建机 jenkins、maven构建机、本地构建包 &#xff08;3&#xff0…

Nodejs安装及使用

现阶段nodejs我用的多的是它里面的npm js的各种库都可以用npm安装&#xff0c;十分方便&#xff0c;再也不用去网上找了 当然&#xff0c;主要还是github上面的很多项目都要用npm“解封” 那下面说下它的安装吧 进入官网 https://nodejs.org/en/ 它会自动检测你的电脑&#xf…