通过官方的介绍可知,若要本地开始部署搭建一个基于.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. mysql 优化配置参数详解

    在 my.cnf 文件中 各设置参数的含义如下: innodb_data_home_dir 这是InnoDB表的目录共用设置.如果没有在 my.cnf 进行设置,InnoDB 将使用MySQL的 da ...

  2. 在github上写博客

    在github上混了几个月,收获颇多.作为一个开源的坚定信仰者,深深觉得每一个码农都应该参与到开源社区中,github提供了一个平台,让你为开源项目提交代码变得异常简单和直接.以前由于工作异常繁忙和繁 ...

  3. 最详细的Linux YUM命令使用教程

    YUM(Yellow dog Updater, Modified)为多个Linux发行版的前端软件包管理器,例如 Redhat RHEL, CentOS & Fedora.  YUM通过调用R ...

  4. Oracle中Kill session的研究(转 出自eagle)

    itpub link: http://www.itpub.net/235873.html 我们知道,在Oracle数据库中,可以通过kill session的方式来终止一个进程,其基本语法结构为: a ...

  5. qt下调用win32api 修改分辨率

    在头文件中添加 #include <window.h> DEVMODE DevMode; EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, ...

  6. 【转】JavaScript中的对象复制(Object Clone)

    JavaScript中并没有直接提供对象复制(Object Clone)的方法.因此下面的代码中改变对象b的时候,也就改变了对象a. a = {k1:1, k2:2, k3:3}; b = a; b. ...

  7. [转]ios平台内存常见问题

    本文转自CocoaChina,说的满详细的: 链接地址:http://www.cocoachina.com/bbs/read.php?tid=94017&keyword=%C4%DA%B4%E ...

  8. tensorflow 运行成功!

    折腾了一天安装tensorflow环境,终于可以运行,也记录一下安装中容易犯的错误总结(写给python小白们) 一.win7 双系统 安装ubuntu 16.04 ,参考 http://jingya ...

  9. python问题:IndentationError:expected an indented block错误解决

    Python语言是一款对缩进非常敏感的语言,给很多初学者带来了困惑,即便是很有经验的Python程序员,也可能陷入陷阱当中.最常见的情况是tab和空格的混用会导致错误,或者缩进不对,而这是用肉眼无法分 ...

  10. C# MailMessage Attachment 中文名附件发邮件-Firefox中文显示正常,网页打开邮件附件中文名乱码

    一.故事 首先通过CDO.Message来获取邮件EML相关数据:邮件标题.邮件内容.邮件附件.发件人.收件人.CC主要就这么几个,其次通过MailMessage来组织邮件通过Python来发送邮件! ...