粗略使用.NetCore2.0自带授权登陆Authorize

上篇Linux+.NetCore+Nginx搭建集群 有朋友提及到如果nginx做集群后应该还会有下一篇文章主讲session控制,一般来说就是登陆;本篇分享的内容不是关于分布式session内容,而是netcore自带的授权Authorize,Authorize粗略的用法,希望能对大家有好的帮助;

  • web网站session和cookie关系

  • 在NetCore中使用Authorize登陆

web网站session和cookie关系

要说session和cookie关系,恐怕有很多文章都有说过,这里我只阐述下自己的理解,尽可能的做到通俗易懂;对于session往往存储于服务端,登陆的话session一般会存储登陆用户的基本信息,还有个会话唯一sessionId(以下简称:token),这个token会分配到每个用户头上,服务端根据用户请求的token来识别服务端存储的登陆信息,以此达到登陆的目的;

客户端要传递这个同样的token,必须要存储起来,这就要用到咋们说的cookie,客户端用cookie来存储token,cookie拥有过期时间特性能够很好的做到登录失效的效果(尽管session也有),往往在分布式的时候cookie和session的失效时间都会设置,只要某一个时间过期了将视为需要重新登录或者需要重新设置cookie;下面将截图在谷歌浏览器下某个网站的cookie存储图:

能够看出cookie存储就是key-value的方式,唯一的名字+value;

在.NetCore中使用Authorize登陆

对于Authorize经常使用mvc的朋友肯定不陌生,在core中使用Authorize登录首先需要在Starup.cs的ConfigureServices方法中配置下,这里我直接给出粗略的配置吧(满足登录):

public void ConfigureServices(IServiceCollection services)

        {

            services.AddMvc();


            //配置authorrize

            services.AddAuthentication(b =>

            {

                b.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;

                b.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;

                b.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;

            }).

            AddCookie(b =>

            {

                //登陆地址

                b.LoginPath = "/login";

                //sid

                b.Cookie.Name = "My_SessionId";

                // b.Cookie.Domain = "shenniu.core.com";

                b.Cookie.Path = "/";

                b.Cookie.HttpOnly = true;

                b.Cookie.Expiration = new TimeSpan(0, 0, 30);


                b.ExpireTimeSpan = new TimeSpan(0, 0, 30);

            });

        }

下面简单说明下cookie的属性效果:
  • b.Cookie.Name:就是cookie的名字,对应第一小节谷歌浏览器截图的Name;

  • b.LoginPath:设置登陆失败或者未登录授权的情况下,直接跳转的路径这里,这是/login;

  • b.Cookie.Domain:指定cookie对应的域名,这里我没域名和没设置本地host所以屏蔽,屏蔽的或默认localhost;

  • b.Cookie.HttpOnly:设置cookie只读情况;

  • b.Cookie.Expiration:cookie过期时间;

好了咋们设置完后,需要在login页面设置这样的逻辑和代码;首先是get路由,她会做两件事情:验证是否已授权登陆过和未登录显示登录试图界面:

public IActionResult OnGet()

{

    //登录授权直接跳转index界面

    if (HttpContext.User.Identity.IsAuthenticated)

    {

         return RedirectToPage("Index");

    }

    return Page();

}

这里利用Identity.IsAuthenticated来校验登录状态,登录了直接重定向到主页面Index这没什么说的;如果没登录,需要用户登陆下,然后在做授权,以下是用户post提交的登录请求处理:

/// <summary>

        /// 登录

        /// </summary>

        /// <returns></returns>

        public async Task<IActionResult> OnPost()

        {


            if (ModelState.IsValid)

            {

                //登陆授权

                var claims = new List<Claim>();

                claims.Add(new Claim(ClaimTypes.Name, this.LoginUser.UserName));

                var indentity = new ClaimsIdentity(claims, "denglu");

                var principal = new ClaimsPrincipal(indentity);

                await HttpContext.SignInAsync(

                    CookieAuthenticationDefaults.AuthenticationScheme,

                    principal);


                //验证是否授权成功

                if (principal.Identity.IsAuthenticated)

                {

                    return RedirectToPage("Index");

                }

            }

            return Page();

        }

主要通过HttpContext.SignInAsync()来设置授权,Claim设置一些账号等信息;这里我用的是2.0出的Razor模板,也为了更好的学习razor的请求和绑定数据方式,因此这里给出具体的cshtml代码布局代码:

@page
@model LoginModel
@{
}<form method="post"><input type="text" name="LoginUser.UserName" /><button type="submit" class="btn">登陆</button>
</form>

需要注意的是输入框的那么这样写的 name="LoginUser.UserName" ,对应的cs后台代码必须要这样设置实体:

[BindProperty]public MoLoginUser LoginUser { get; set; }

需要设置 [BindProperty] 标记,不然没有初始化LoginUser对象会有问题的(本章也不打算讲解更多的razor模板提交的方式,等以后有需要在说吧);

回来说authorize,通过上面配置和登录的设置,我们还需要通过 [Authorize] 标记哪些界面或者操作需要授权登陆才能执行,比如我这里的Index界面需要登录后才能显示内容,所以只需要在class上添加标记 [Authorize] 就行了:

有了登陆,咋们还需要退出,直接给出退出的具体代码:

/// <summary>

/// 退出

/// </summary>

/// <returns></returns>

public async Task<IActionResult> OnGetLoginOutAsync()

{

            if (HttpContext.User.Identity.IsAuthenticated)

            {

                await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);

            }

            return RedirectToPage("Login");

}

实际也仅仅只需要 HttpContext.SignOutAsync 就完成了注销,这就是Authorize提供的便利;由于这里还是razor模板,因此在多get提交注销的时候,如果您自定义了非OnGet或OnGetAsnyc方法名外的get函数,如: public asyncTask<IActionResult> OnGetLoginOutAsync() ,那么需要指定get的handler请求参数:hanlder=LoginOut,举个退出按钮的例子,这里的href指定的请求格式如: /login?handler=loginout ,这样才能请求的login界面的退出 OnGetLoginOutAsync 方法,好吧下面看下效果图:

如果本文对您有好的帮助,不妨点个赞支持下,谢谢!!!

相关文章: 

  • .NET应用迁移到.NET Core(一)

  • .NET应用迁移到.NET Core(二)风险评估

  • .NET应用迁移到.NET Core(三)从商业角度看移植过程

  • .NET应用迁移到.NET Core--调查案例

  • 迁移传统.net 应用到.net core [视频]

  • 应用工具 .NET Portability Analyzer 分析迁移dotnet core

  • .net core 2.0学习笔记(一):开发运行环境搭建

  • .net core 2.0学习笔记(二):Hello World & 进阶

  • 度量.net framework 迁移到.net core的工作量

  • 迁移.net framework 工程到.net core

  • .NET Core 2.0迁移技巧之web.config配置文件

  • 程序配置&ConfigurationManager

  • .NET Core 2.0迁移技巧之MemoryCache问题修复

  • Remoting核心类库RealProxy迁移

  • Linux+.NetCore+Nginx搭建集群

原文地址:http://www.cnblogs.com/wangrudong003/p/7469292.html


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

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

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

相关文章

vue中如何在地图中标点…

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”前言昨天分享了下vue中v-for的一些特殊用法&#xff0c;料想标题给写成了vi-for…太粗心了。文章连接在这里&#xff1a;vue中如何使用v-for限制遍历的条数&#xff1f;只查询前三条、…

P3501-[POI2010]ANT-Antisymmetry【hash,二分答案】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP3501 大意 一个01串&#xff0c;如果一个串翻转后取反和原串是相同的&#xff0c;那么这就是个反对称的。求这个01串有多少个子串是反对称的。 解题思路 一个反对称串就是将这个串取反然后放在原串后…

被黑客盯上了…数据都给打包带走了…

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”前言在创建数据库的时候&#xff0c;突然之间&#xff0c;发现创建的表通过select * from 表名 查询不到了&#xff0c;于是就开始检查是不是sql语句写错了&#xff0c;检查半天&#…

编译原理(二)之语法分析

采用实验1的简单语言&#xff0c;设计并实现含多条简单赋值语句的语法分析程序&#xff0c;要求采用算符优先的分析算法。 注意与实验1、2的衔接。 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using Syste…

ASP.Net Core Razor 页面路由

在服务器端 Web 应用程序框架中&#xff0c;其中非常重要的设计是开发人员如何将URL与服务器上的资源进行匹配&#xff0c;以便正确的处理请求。最简单的方法是将 URL 映射到磁盘上的物理文件&#xff0c;在 Razor 页面框架中&#xff0c;ASP.NET团队就是这样实现的。 关于 Ra…

vue实现下拉列表远程搜索示例(根据关键词模糊搜索)

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”前言昨天的链接没有放上去……大家访问新站的时候&#xff0c;可以在浏览器地址栏中输入&#xff1a;www.穆雄雄.com或者www.muxiongxiong.cn都可以。今天分享的效果如下&#xff1a;ima…

P3538-[POI2012]OKR-A Horrible Poem【hash,字符串】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP3538 题目大意 给一个字符串&#xff0c;有q个询问&#xff0c;询问一个区间最短循环节。 解题思路 首先最短循环节长度一定长度的约数&#xff0c;所以我们可以枚举约数&#xff0c;然后判断循环节…

编译原理(三)之语义分析

采用实验1的简单语言&#xff0c;设计并实现含多条简单赋值语句的语法语义分析程序&#xff0c;要求采用递归下降翻译法。 注意与实验1、2的衔接。 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.T…

活动: 北京Xamarin分享会第6期(2017年9月9日)

每月第二个周六&#xff0c;北京丹棱街5号微软大厦&#xff0c;有什么活动&#xff1f;对, BXUG线下分享活动又来啦! 本次分享嘉宾阵容庞大&#xff0c;在金秋凉爽的季节&#xff0c;期待与大家面对面的交流。内容预告&#xff1a; 案例分享&#xff1a;某大型国企IT项目如何采…

捡到东西说给钱才给东西?算不算敲诈勒索……

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”前言前两天&#xff0c;将一个那天急要但是后来就不重要的东西&#xff0c;放在车筐里面&#xff0c;结果到目的地一看&#xff0c;没了……椅子还没坐热&#xff0c;有人打来电话了“你…

编译原理(四)之解析语言翻译成三地址代码

选择部分C语言的语法成分&#xff0c;设计其词法语法语义分析程序。 设计并实现一个一遍扫描的词法语法语义分析程序&#xff0c;将部分C语言的语法成分翻译成三地址代码&#xff0c;要求有一定的出错提示和错误恢复功能。 例如简单赋值语句&#xff1a; area3.14*a*a; s 2*…

POJ3784-Running Median(运行中位数)【链表】

正题 题目链接&#xff1a;http://poj.org/problem?id3784 题目大意 给出n个数&#xff0c;每两个数输出一次到目前为止输入了的所有数的中位数。 解题思路 我们使用离线算法。 既然这是一个一个输入&#xff0c;那么我们就用秘技时光倒流之数。先把所有数加入进去&#x…

[北京微软技术直通车]前端 Visual Studio Code 开发 Angular 与亿级 SQL Servern

微软技术直通车第一期将于2017年9月9日与大家见面&#xff0c;本次邀请华北区微软技术专家和大家一起交流前端工具与技术&#xff0c; Visual Studio Code&#xff0c;TypeScript 与 Anuglar 项目开发和亿级数据库运维的最佳实践&#xff0c;分享相关技术的发展前景和从业经验&…

vue中如何实现全全全屏和退出全屏?

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”最近总有人给我说ta有社恐&#xff0c;明明是有社牛好不好……前言在做大屏界面的时候&#xff0c;客户有个要求&#xff0c;一进去登录成功之后&#xff0c;要有全屏的功能&#xff0c;…

Spring MVC请求url无效问题思考

一、Controller没有配置 page not found or method not supported. 没有扫描到包里面的controller类 <context:component-scan base-package"com.mk.controller" /> 二、请求方式GET/POST org.springframework.web.servlet.PageNotFound noHandlerFound No…

P1160-队列安排【链表】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP1160 题目大意 有nn个人,编号是1&#x223C;n" role="presentation">1∼n1∼n&#xff0c;然后开始时插入第一个人&#xff0c;之后每次可以插入到一个人的左边或右边&#xff0…

【深圳】掌通宝科技有限公司技术总监(兼架构师),约吗

技术总监&#xff08;兼架构师&#xff09; 岗位职责&#xff1a; 1、主持研发中心日常管理工作&#xff0c;负责公司O2O平台,SaaS平台管理&#xff1b; 2、负责公司.net后台&#xff0c;Android客户端、IOS客户端、WEB平台等架构设计&#xff1b; 4、解决开发中的技术问题…

树层级处理上万条数据优化!

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”前言项目中&#xff0c;部门数超万&#xff0c;导致页面加载价卡顿怎么办&#xff1f;使用若依自带解析树的方法在本地运行没有任何问题&#xff0c;但是一发布到服务器上就显示加载超…

Idea Tomcat启动报异常CannotLoadBeanClassException

一、现象展现 Idea配置占用了C磁盘的所有空间&#xff0c;删除Idea配置目录后&#xff0c;改为D磁盘存储Idea配置。 由于idea的Artifact&#xff08;war explode包&#xff09;在没有整个项目重新构建情况下没有执行热发布&#xff0c;从而删除Artifact的war和war explode包&…

P3435-[POI2006]OKR-Periods of Words【KMP】

正题 评测记录:https://www.luogu.org/recordnew/lists?uid52918&pidP3435 大意 一个字符串&#xff0c;对于每个前缀&#xff0c;求复制一份放在末尾可以覆盖整个前缀的前缀&#xff0c;求所有的长度和。 解题思路 这道题如果暴力的话很简单&#xff0c;对于每个前缀每…