通过官方的介绍可知,若要本地开始部署搭建一个基于.net core 1.0的Web应用,需要下载dotnet SDK,或在Visual Studio IDE之上安装相关插件以布置开发环境。为了使开发环境最小化,选择安装dotnet SDK。下载地址为:http://asp.net

0x00.新建一个Web应用项目

这里不必赘述,到相应目录中运行命令提示符:dotnet new -t web。dotnet会非常人性化的携带自己的例程,如果基于微软提供的例程进行开发的话,会提速不少。但在实际应用中却往往用不到这些功能,或者需要定制化的一些功能。认证过程就是一个经常需要定制化的模块。本文仅介绍认证过程的自定义。在代码部署到本地之后,项目的运行需要依赖库,包含但可能不仅局限于依赖库的一些配置需要下载到本地,使用dotnet SDK,在项目根目录(携带有project.json文件的目录,该文件内为描述项目的配置文件)执行命令:dotnet restore。至此,即可运行Web应用程序,执行命令:dotnet run。将默认监听5000端口,启动Web服务。如果希望改变默认监听端口,一种解决方案是在Program.cs中的WebHostBuilder()之后添加中间件: .UseUrls(http://localhost:8080)即可改变监听的套接字。

关于dotnet的详细应用,可以参考官方API文档:https://docs.microsoft.com/zh-cn/dotnet/articles/core/tools/index

为了便于重新构建,将项目的各个附加项均删减。

只预留HomeController类,及HomeController类下的Index方法(或者应该叫Action?)

0x01.认证流程简析

通过观察发现,.net core使用了两种架构来实现新一代的Web应用框架。

  1. 管道架构(Pipeline)
  2. 模块架构(MVC)

管道架构的业务流程描述可以理解为在一个业务管道(可能存在分支,在OWIN中通过Map来实现)中先后分布有过滤节点(以Middleware来实现),一个事物实体从管道的输入端输入,逐个流经过滤节点,在过滤节点中可以对流经的事物实体进行过滤(包括增加、删除、丢弃等等动作)。在Web应用中,流经管道的事物实体为客户端发往服务器端的请求实体。

模块架构,这个名称是自己杜撰得出的,与MVC在所属上有不同,特此标记。核心节点为router,即事物实体侧重携带控制信息(即至少有用于指代资源的名称)首先发往router,router根据控制信息来获得资源地址或资源路由,再转交给相关的业务模块进行执行。在MVC定义中,router的职责由Controller来完成,业务执行由Model来完成。在实际工作中,往往Model指代业务实体,Controller下的具体Action执行业务流程。

以认证与具体的业务分发的角度去考虑,客户端如果登录系统(泛指通过系统认证)后,通常的解决方案是将token携带在Cookie中发往服务器。而流经认证模块之后,认证模块可提取Cookie中的值,映射成为用户标识(在.net core 1.0中以HttpContext.User为代表)。用户标识所具备的属性用户可自定义(通常为角色,代表却不仅局限于代表用户权限)。而微软所提供的例程及模块便是基于Cookie传递token进行的。

实际情况下,采用Cookie存储token的解决方案通常应用于单纯的网站认证。而存在大量的应用,其存储token并不一定在Cookie中,基于此,开始设计自定义的认证过程。

0x02..net core 1.0的认证过程

将在startup.cs中的app.UseIdentity()一句删除,此时HttpContext.User不代表任何登录用户,并在HomeController.cs中的Index方法加上AuthorizeAttribute特征。运行web应用,访问发现返回404 not found。 应该是.net core 1.0 的安全策略。 若删除掉特征AuthorizeAttribute后,则可正常访问。

将在startup.cs中的app.UseIdentity()删除的地方添加如下一段代码:

app.Use(next => async context => { context.User.AddIdentity(new ClaimsIdentity("a", "b", "c"); return next(context); });

此时,无论哪种用户请求体,只要流经该过滤节点后,均被认证为一个用户。此时,即便是HomeController类中的Index方法是否携带有AuthorizeAttribute。均可访问。

由此观之,只要在具体业务分发前(即代码app.UseMvc()之前)确认认证,即可真实授权。

0x03.HttpContext.User属性

通过上文即可得知,特征是否起作用就是由HttpContext.User决定的。下文给出MSDN的相关定义:

The User Property provides programmatic access to the properties and methods of the IPrincipal interface.

遂观察IPrincipal接口。

Defines the basic functionality of a principal object.

包含属性Identity

Get the identity of the current principal.

包含方法 IsInRole(String)

Determines whether the current principal belongs to the specified role.

至此可知,router将取出HttpContext.User.Identity,来判断是否存在用户。

上边一段程序我们可以得知,添加用户凭证的方法为HttpContext.User.AddIdentity(ClaimsIdentity)ClaimsIdentity实质上是Claim的一个容器。

.net core 1.0 Web MVC 自定义认证过程的更多相关文章

  1. .Net Core 2.0 preview1实现自定义认证方案

    Microsoft.Authentication的使用方法在2.0中发生了比较大的变化,在1.1中认证配置是在Configure中完成. public void ConfigureServices(I ...

  2. 从头编写 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的相 ...

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

    第一部分:http://www.cnblogs.com/cgzl/p/7637250.html 第二部分:http://www.cnblogs.com/cgzl/p/7640077.html 之前我介 ...

  4. 【转载】从头编写 asp.net core 2.0 web api 基础框架 (3)

    Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-template-from-scratc ...

  5. 【转载】从头编写 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的相 ...

  6. .Net Core .Net Core V1.0 创建MVC项目

    .Net Core V1.0 创建MVC项目 创建MVC项目有两种方式: 一.创建Web项目:(有太多没用的东西要去删太麻烦) 2.项目目录结构: 此种方法要注意的是,会创建好多个json文件,下面就 ...

  7. 从头编写asp.net core 2.0 web api 基础框架 (5) + 使用Identity Server 4建立Authorization Server (7) 可运行前后台源码

    前台使用angular 5, 后台是asp.net core 2.0 web api + identity server 4. 从头编写asp.net core 2.0 web api 基础框架: 第 ...

  8. net core 2.0 web api + Identity Server 4 + angular 5

    net core 2.0 web api + Identity Server 4 + angular 5前台使用angular 5, 后台是asp.net core 2.0 web api + ide ...

  9. asp.net core 2.0 web api + Identity Server 4 + angular 5 可运行前后台源码

    前台使用angular 5, 后台是asp.net core 2.0 web api + identity server 4. 从头编写asp.net core 2.0 web api 基础框架: 第 ...

随机推荐

  1. SoapUI Pro Project Solution Collection-DataSource(jdbc,excel)

    here give a solution for excel file change the excel configuration these: Set Excel file path in cur ...

  2. Java关键字--static

    在Java中,将关键字static分为三部分进行讨论,分别为Java静态变量.Java静态方法.Java静态类 Java Static Variables Java instance variable ...

  3. 统一回复《怎么学JavaScript?》

    作者:小不了链接:https://zhuanlan.zhihu.com/p/23265155来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 鉴于时不时,有同学私信问我( ...

  4. Hadoop 2.7.1 源代码目录结构分析

    采用的源代码是2.7.1的,从这个网站下可以找到2.7.1的代码:https://git1-us-west.apache.org/ ,使用gitclone出来,然后git checkout到2.7.1 ...

  5. 转:HTML5标准与性能之四:asm.js

    HTML5标准与性能之四:asm.js Cong Liu (Intel) 于 星期五, 24/05/2013 - 01:13 提交 之前的几篇文章分别介绍了WebWorkers.Typed Array ...

  6. 解决cxf+spring发布的webservice,types,portType和message以import方式导入

    用cxf+spring发布了webservice,发现生成的wsdl的types,message和portType都以import的方式导入的.. 原因:命名空间问题 我想要生成的wsdl在同个文件中 ...

  7. C#如何更好地理解引用类型和值类型

    说道值类型和引用类型,在C#中,官方的说法就是: 值类型直接指向数据:一般包括C#自带的所有数字类型,字符类型,bool类型,当然还有自定义的结构类型和枚举类型 而引用类型则是指向数据存储的地址.一般 ...

  8. Spring3系列9- Spring AOP——Advice

    Spring3系列9- Spring AOP——Advice Spring AOP即Aspect-oriented programming,面向切面编程,是作为面向对象编程的一种补充,专门用于处理系统 ...

  9. .NET Framework 高级开发

    .NET Framework 高级开发 MSDN 这部分帮助介绍与 .NET Framework 相关的高级编程主题. 本节内容 管理 介绍如何管理 Active Directory 中的对象,如何使 ...

  10. assets中放入中文文件名导致Android Studio编译错误

    一个android项目突然出现编译错误,如下: :app:processDebugResources FAILED FAILURE: Build failed with an exception. * ...