粗略使用.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;只查询前三条、…

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

“大家好&#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…

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

采用实验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*…

[北京微软技术直通车]前端 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;…

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

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

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

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

Orleans解决并发之痛(三):集群

Orleans本身的设计是一个分布式的框架&#xff0c;多个Silo构成集群&#xff0c;Grains分布在多个Silo中。一旦一个Silo挂了&#xff0c;原来归属这个Silo的Grains会自动在其他Silo中激活。生产环境下还是需要以集群方式来部署。 cluster 在Orleans解决并发之痛&#xff08;二…

avue中实现消息的实时展示

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。”前言一个功能写了大半天&#xff0c;主要是数据表设计的有点复杂&#xff0c;且这个项目是10月份就写的放那的&#xff0c;里面有些东西都忘记了……先看数据库结构&#xff0c;然后理…

发达国家与发展中国家编程语言技术的分布差异性

近日&#xff0c;Stack Overflow在官方博客上发布了一组统计数据&#xff0c;表明发达国家与发展中国家在编程语言技术的采用上存在较大的差异。Stack Overflow对2017年1月至8月期间的访问数据进行了分析&#xff0c;选取了64个技术标签&#xff0c;每个标签所包含问题的访问次…

两个map中的数据,按照相同键,将所对应的值相加方法

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”前言最近写代码的时候遇到了个需求&#xff0c;刚开始想的时候&#xff0c;感觉不难&#xff0c;挺简单的&#xff0c;结果写的时候&#xff0c;各种思考、各种费脑&#xff0c;耗费了点…

publiccms中将推荐页的内容显示在页面片段中

遍历的代码如下&#xff1a; <#list page.list><ul><#items as a><li><figure><!-- ${a.itemType!} : ${a.itemId!} ,place/redirect:count and 301 jump to a.url,place/click:count and 302 jump to a.url--><a href"${site.dyn…

ASP.NET Core 运行原理解剖[3]:Middleware-请求管道的构成

在 ASP.NET 中&#xff0c;我们知道&#xff0c;它有一个面向切面的请求管道&#xff0c;有19个主要的事件构成&#xff0c;能够让我们进行灵活的扩展。通常是在 web.config 中通过注册 HttpModule 来实现对请求管道事件监听&#xff0c;并通过 HttpHandler 进入到我们的应用程…

publiccms实现首页菜单栏下拉的方法

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 今天接到了个需求&#xff0c;使用publiccms实现首页导航栏下拉的效果&#xff0c;效果如下&#xff1a; 目前我的思路如下&#xff1a; 采用分类的方法实现将左侧的项作为二级分类右边…