Asp.net 的Security框架除了提供Cookies,OAuth,ActiveDirectory等多个用户认证实现,基本上已经满足业务项目的开发需要了。

当需要实现OAuth2.0服务器端实现的时候第一想法可能是使用IdentityServer3或者4,其实在Security框架中也提供了这样一个简易实现,可以满足我们的需求了,而且代码更加的简洁。在web项目中引入相关nuget包并运行起来,一台OAuth2.0 Server就跑起来了。

核心类就是OAuthAuthorizationServerHandler,总体设计思路就是在该类型中会先判定请求是希望获取AuthorizationCode(这里只讨论授权码模式)还是AccessToken从而执行不同的流程,如果是获取AccessToken的话会判定client_id和redirect_uri正确时候就会返回相应的结果。框架为我们提供了OAuthAuthorizationServerOptions选项参数来配置OAuth2.0.后面所有提到的Options都指该类型。

OAuth2.0在各种操作中会需要传递相应的参数,比如client_id,redirect_uri,response_type之类,框架为我们提供了AuthorizeEndpointRequest类型方便我们根据IOwinRequest提取保存在QueryString里的临时码接口参数,TokenEndpointRequest类型方便我们提取保存在请求Body里的AccessToken接口参数,一切都显得简洁紧凑,避免了一锅粥似得凌乱代码。

1.在请求到来的时候会首先判断请求是否希望获取AuthorizationCode或者AccessToken,如果都不是的话Request请求就不会执行OAuth2.0的代码逻辑。我们可以在OAuthAuthorizationServerOptions配置项的如下两个属性中设置相应的属性。同时框架也为我们提供了一个扩展--Options的MatchesTokenEndpoint来自定义逻辑判断当前请求是否符合OAuth2.0 api接口路径。(我们还可以配置是否只接受https安全连接)

2.如果判断是AuthorizationCode请求的话(默认就是/authorize请求路径),接着确定请求Uri为合法的请求路径,同样的Options参数中也可以设置一些自定义的验证代码,如果一切执行ok,此时我们就需要为Options的Provider属性的OnAuthorizeEndpoint提供如下的一个委托函数,如果我来实现这个OAuth2.0 Server的话,我会在下图的这个委托方法中生成一个随机的code字符串,连同请求Request的state参数(如果有的话)以QueryString参数的形式设置到redirect_uri上,并执行该redirect_uri。这样就能将临时code传递给Application 服务器了。Application服务器获取到该临时code连同其他OAuth2.0规范的参数就可以访问我们的OAuth2.0 Server的AccessToken请求接口了。该AccessToken的Api接口如步骤3。

3.AccessToken接口通常是Application Server在获取到临时Code,带上符合OAuth2.0规范的参数然后发起调用的。如果判断是AccessToken请求的话(默认就是/token请求路径),或许我们需要判定一下请求所携带的client_id和Client_secret是否正确,为了做到这一点,我们需要配置Options的Provider.OnValidateClientAuthentication来进行验证。

如果一切顺利,下面就要生成AccessToken了,框架中生成的AccessToken其实就一个身份信息AuthenticationTicket处理之后生成的一个字符串。如下图所示的Options.AuthorizationCodeProvider.ReceiveAsync(authorizationCodeContext)代码中产生

另外需要注意的是默认产生的AccessToken只有20分钟左右的有效期,这个有效期是必须存在的,我们可以通过配置Options.AccessTokenExpireTimeSpan来配置的长久一些,为了能刷新这个AccessToken必须在其过期之前调用刷新接口。

如果一切执行顺利将会返回如下所示的一个Json字符串

(纯粹是为了下个月找工作而准备的一系列博文,每一篇都尽量精简,并非给初学者看的☺)

Asp.net Security框架(2)的更多相关文章

  1. Asp.net Security框架(1)

    Security框架主要用于身份认证的,基本上所有Asp.net项目有意或者无意的都在使用的,框架的源码包含在Katana项目下. 最常见的使用方式或许就是SignIn来给客户端浏览器生成包含身份信息 ...

  2. ASP.NET Core 框架源码地址

    ASP.NET Core 框架源码地址 https://github.com/dotnet/corefx 这个是.net core的 开源项目地址 https://github.com/aspnet  ...

  3. 从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程

    从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程   用户登录与权限验证是网站不可缺少的一部分功能,asp.net MVC4框架内置了用于实现该功能的类库,只需要简单搭 ...

  4. 探索ASP.NET MVC框架之路由系统

    引言 对于ASP.NET MVC的路由系统相信大家肯定不陌生.今天我们就深入ASP.NET的框架内部来看一下路由系统到底是怎么通过我们给出的地址(例如:/Home/Index)解析出Controlle ...

  5. Asp.net MVC5 框架揭秘 S412 实例解析 – 绝妙的扩展 模式的胜利

    Asp.net MVC5 框架是个 开源的,处处可扩展的框架. 蒋先生 在他的这本书里 对如何理解框架,如何扩展框架, 给出了大量的说明和实例. 先上效果图 大部分做传统BS 的同学看到这个页面,脑海 ...

  6. 写自己的ASP.NET MVC框架(上)

    http://www.cnblogs.com/fish-li/archive/2012/02/12/2348395.html 阅读目录 开始 ASP.NET程序的几种开发方式 介绍我的MVC框架 我的 ...

  7. 学习“迷你ASP.NET MVC框架”后的小结

    看蒋老师MVC的书第二个大收获可以是算是看了这个迷你ASP.NET MVC框架了,虽然它远不如真正ASP.NET MVC(下文简称“MVC”)那么复杂庞大,但在迷你版中绕来绕去也够呛的.这部分我看了几 ...

  8. 如何用asp.net MVC框架、highChart库从sql server数据库获取数据动态生成柱状图

    如何用asp.net MVC框架.highChart库从sql server数据库获取数据动态生成柱状图?效果大概是这样的,如图: 请问大侠这个这么实现呢?

  9. BrnShop开源网上商城第二讲:ASP.NET MVC框架

    在团队设计BrnShop的web项目之初,我们碰到了两个问题,第一个是数据的复用和传递,第二个是大mvc框架和小mvc框架的选择.下面我依次来说明下. 首先是数据的复用和传递:对于BrnShop的每一 ...

随机推荐

  1. Golang学习---常用库

    1. 路由库:github.com/julienschmidt/httprouter 2. mysql驱动:github.com/go-sql-driver/mysql

  2. Android Toast 工具类

    android  中常用系统吐司工具类 package cn.yhq.utils; import android.content.Context; import android.widget.Toas ...

  3. TZOJ 5694 区间和II(树状数组区间加区间和)

    描述 给定n个整数,有两个操作: (1)给某个区间中的每个数增加一个值: (2)查询某个区间的和. 输入 第一行包括两个正整数n和q(1<=n, q<=100000),分别为序列的长度和操 ...

  4. linux中service XX start与直接运行/usr/bin/xx start的区别

    在linux想要运行启动一个服务有两种方法: 1,运行/etc/init.d/目录下的shell脚本,还可以有快捷方式,service *** start/ stop/restart /status, ...

  5. JAVA EE 环境配置——JAVA8 下载安装和 Eclipse EE的下载安装

    说明:我的电脑是win10 64位操作系统 步骤1:下载Java8 浏览器输入www.oracle.com,点击 Downloads,选择 Java ,选择 Java (JDK) for Develo ...

  6. 20164319 刘蕴哲 Exp1 PC平台逆向破解

    [实践内容概述] 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,ge ...

  7. 使用Json.net对Json进行遍历

    公司使用了一种伪Json, 当value为字符串并且以"@"开头时, 要替换成真实的值, 比如{"name":"@countryName"} ...

  8. python基础 (装饰器,内置函数)

    https://docs.python.org/zh-cn/3.7/library/functions.html 1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使 ...

  9. windows socket 文件下载上传

    socket 图片 文件 下载上传  数据库 线程池  存入图片 等

  10. Maven 属性

    maven 中使用 ${属性名} 来访问属性 内置属性 (maven 预定义,用户可以直接使用的属性) ${basedir}  表示项目根目录,即包含 pom.xml 文件的目录.同 ${projec ...