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. Java中的属性和方法

    题目 实体类 测试类

  2. 毕设之iframe跳转子页面问题

    我的Django项目中的index.html分为三个层次,head.body.footer.其中body细分为left和right两部分,right的地图是使用iframe嵌入的map.html页面, ...

  3. php使用redis的GEO地理信息类型

    redis3.2中增中了对GEO类型的支持,该类型存储经纬度,提供了经纬设置,查询,范围查询,距离查询,经纬度hash等操作. <?php $redis = new Redis(); $redi ...

  4. PHP整理--PHP面向对象

    一.定义类 使用关键字class定义 二.实例化对象  使用关键字new实例化对象 三.类成员的添加和访问 (1)类成员:属性.方法.常量 (2)添加成员需要使用修饰符  public.protect ...

  5. eclipse java tomcat 远程调试

    在远程linux上修改tomcat 中bin 文件夹下 修改catalina.sh文件,在最前面加上如下代码: CATALINA_OPTS="-Xdebug -Xrunjdwp:transp ...

  6. MUI 添加自定义图标(注意点)

    参考: https://blog.csdn.net/qq_39759115/article/details/79436606 注意: 1. 将这个原来的逗号改成分号 2. 这些图标的名字都可以改名字

  7. centos 下使用vscode 调试egg.js 注意事项

    这两天在centos下,直接用vscode运行egg.js的例子.遇到个问题就是当安装了vscode-egg插件,会遇到一个现象.就是同样的代码,Windows下调试可以顺利进行,但是centos有时 ...

  8. python 数据可视化 -- 生成可控的随机数据集合

    生成可控的随机数据集合 使用 numpy.random 模块 numpy.random.random(size=None)  返回 [0.0, 1.0) 区间的随机 floats, 默认返回一个 fl ...

  9. es6数值

    ES6在Number对象上,新提供了Number.isFinite()和Number.isNaN()两个方法,用来检查Infinite和NaN这两个特殊值. Number.isFinite(15); ...

  10. 检查SQL Server被哪个进程占用,且杀进程。

    -----检查DB的名字---------------------------------------DECLARE @dbName varchar(50)SET @dbName='RegisterO ...